将对数形式重新排列为指数形式

时间:2016-07-06 22:33:57

标签: c# logarithm exponential

我在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等等上)。

1 个答案:

答案 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