繁体   English   中英

有没有理由使用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 )之前,我想弄清楚是否有任何1500d的理由来保持原始符号?

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

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

Thread.sleep(5 * 60 * 1000);

这种风格使线程更加明显地睡了5分钟。 在处理数学公式时,通常会保持公式的每个值都保持不变,因此显而易见的是使用了哪个公式并且正确使用了公式。

程序员喜欢为了可读性而长时间地写出东西:例如,知道在正常的一天有86400秒确实属于酒吧测验的参与者,而不是程序员。

但是那样说,我倾向于使用Math.pow

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

您可能会发现pow(x, y)实现为exp(y log x) :由于浮点double仅精确到15左右,因此可以“关闭” xy令人惊讶的微不足道的值图。

(目前JLS只指定了一个Math.pow两个double参数的Math.pow函数。如果你要使用整数文字,那么编译器会在调用函数之前自动将它们转换为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 但请检查这些值是否与原始值相同; 并仔细调查任何差异的影响。

它可以更容易验证公式是否已正确转换为代码。 还要考虑是否应该用命名常量替换其中一些数字文字,以进一步提高可读性。 在不了解背景的情况下,它看起来很多“神奇的数字”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM