我在Minecraft mod中使用了一系列对数,我设计了一个程序,使用这些对数来计算该mod中机器的运行时间值。我遇到的问题是我必须将大约30个对数重新排列成指数形式。 (我可以手工完成,但如果我能为我做一个程序就会容易得多)
这些日志属于基础2,以下是一个示例:
T = 900 - 60 * Log2(Speed + 1)
在代码中,这将是这样的:
T = 900 - 60 * Math.Log((Speed + 1), 2);
当然,可以使用Math.Log(如上所述)将此公式直接放入C#中。但是,重新排列的公式看起来像这样:
2^((-900+T)/-60) - 1 = Speed
我如何创建一个可以在这两种形式之间转换的程序(将输入作为对数之一,程序输出将是指数形式)? MSDN(C#)上的数学库中列出了Math.Exp方法,但是它处理基数e的对数,而不是基数2.
注意:T表示刻度,第二个刻度中有20个刻度
注2:所有30个对数使用与上面列出的相似的格式,唯一的区别是前两个数字(例如,而不是900 - 60,可能是1200 - 60,或480 - 35等等上)。
答案 0 :(得分:0)
Speed = Math.Pow( 2, ( T - 900 ) / -60 ) - 1
这个答案的更通用的公式:
Speed = Math.Pow( 2, ( T - C1) / -C2) - 1
其中C1和C2是常数。在问题中给出的特定示例中,C1为900,C2为60。
<强>更新强>
如果函数相同但只有不同的数字,一般的方法是定义公共函数,并用不同的参数调用它:
Func<int, int, int, double> f = (T, C1, C2) => Math.Pow( 2, (T - C1) / - C2) - 1;
var Speed = f(T, 900, 60);
另一种选择是将函数存储在数组或字典中:
Func<int, double>[] functions = { T => Math.Pow(2, (T - 900) / -60) - 1,
T => Math.Pow(2, (T - 1200) / -60) - 1,
T => Math.Pow(2, (T - 480) / -35) - 1 };
var Speed = functions[0](T); // calls the first function in the functions array