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

Rearranging Logarithm Form to Exponential Form

我有一系列用于我的世界 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表示ticks,一秒有20个ticks

注 2:所有 30 个对数都使用与上面列出的相似的格式,唯一的区别是前两个数字(例如,不是 900 - 60,它可能是 1200 - 60,或 480 - 35等等)。

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