[英]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
。
现在,在我继续将所有这些替换为各自的结果(上面的示例为1000d
, 90000d
, 1500d
)之前,我想弄清楚是否有任何1500d
的理由来保持原始符号?
我想到的唯一一件事就是保持代码与建模公式的相似性。 还有其他原因我看不到吗?
它基本上都是关于可读性的。 在处理时间时,您会更常见到这种代码样式,例如:
Thread.sleep(5 * 60 * 1000);
这种风格使线程更加明显地睡了5分钟。 在处理数学公式时,通常会保持公式的每个值都保持不变,因此显而易见的是使用了哪个公式并且正确使用了公式。
程序员喜欢为了可读性而长时间地写出东西:例如,知道在正常的一天有86400秒确实属于酒吧测验的参与者,而不是程序员。
但是那样说,我倾向于不使用Math.pow
。
主要原因是它可能不是编译时可评估的常量表达式 ,尽管这可能取决于编译器。
您可能会发现pow(x, y)
实现为exp(y log x)
:由于浮点double
仅精确到15左右,因此可以“关闭” x
和y
令人惊讶的微不足道的值图。
(目前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.