是否有任何理由将 Math.pow() 与文字而不是结果本身一起使用?

Is there any reason to use Math.pow() with literals rather than the result itself?

我目前正在查看现有代码。已经编写了许多方法来对现有公式进行建模。我偶然发现了很多代码实例,例如 Math.pow(10.0D, 3.0D)Math.pow(300.0D, 2.0D) 以及 1.5D * 1000.0D.

现在,在我继续用它们各自的结果替换所有这些之前(1000d90000d1500d 对于上面的例子),我想知道是否有有什么好的理由要保留原始符号吗?

我唯一想到的是保持代码与建模公式的相似性。还有其他原因我看不到吗?

为了可读性,程序员喜欢长篇大论:例如,知道正常一天有 86400 秒确实属于参加酒吧测验的人,而不是程序员。

但话虽如此,我倾向于为此使用Math.pow

主要原因是它可能不是编译时可计算常量表达式,尽管可能 取决于编译器。

您可能会发现 pow(x, y) 被实现为 exp(y log x):这可以 "go off" 用于 xy 的令人惊讶的微不足道的值,因为浮点数 double 仅精确到大约 15 位小数有效数字。

(目前 JLS 只指定了一个 Math.pow 函数,它接受两个 double 参数。如果你要使用整数文字,那么编译器会自动将它们转换为 double 类型在调用函数之前。看来作者正在使用 double 文字来防止将来引入 Math.pow 重载的可能性。)

在您的特定情况下,我会考虑将 Math.pow(300.0D, 2.0D) 替换为 300.0 * 300.0,将 Math.pow(10.0D, 3.0D) 替换为 10.0 * 10.0 * 10.0。但是请检查这些值是否与原始值相同;并仔细调查任何差异的影响。

这基本上都是关于可读性的。在处理时间时,您会更常见地看到这种代码风格,例如:

Thread.sleep(5 * 60 * 1000);

这种风格让线程休眠5分钟更加明显。在处理数学公式时,通常会保持公式的每个值完好无损,因此很明显正在使用什么公式,并且它正在被正确使用。

它可以更轻松地验证公式是否已正确转换为代码。还要考虑是否应将其中一些数字文字替换为命名常量以进一步提高可读性。不知道上下文,看起来很多"magic numbers".