我目前正在查看现有代码。编写现有公式的方法有很多种。我偶然发现了几十个代码实例,例如Math.pow(10.0D, 3.0D)
,Math.pow(300.0D, 2.0D)
以及类似1.5D * 1000.0D
的内容。
现在,在我继续将所有这些替换为各自的结果(1000d
,90000d
,1500d
以获取上述示例之前)之前,我想知道是否有任何结果保持原始符号的充分理由?
我唯一想到的就是保持代码与建模公式的相似性。还有其他原因我看不到吗?
答案 0 :(得分:7)
这基本上都与可读性有关。在处理时间时,您会更常见到这种代码风格,例如:
Thread.sleep(5 * 60 * 1000);
这种风格使线程更加明显地睡了5分钟。在处理数学公式时,通常会保持公式的每个值都保持不变,因此显而易见的是使用了哪个公式并且正确使用了公式。
答案 1 :(得分:5)
为了便于阅读,程序员喜欢长篇大论:例如,知道在正常的一天有86400秒确实属于酒吧测验的参与者,而不是程序员。
但是说,我倾向于不使用Math.pow
。
主要原因是它可能不是编译时可评估的常量表达式,尽管可能依赖于编译器。
您可能会发现pow(x, y)
已实现为exp(y log x)
:由于浮点数的原因,x
和y
出现了令人惊讶的微不足道的值,因此可以“关闭” 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
。但请检查这些值是否与原始值相同;并仔细调查任何差异的影响。
答案 2 :(得分:3)
可以更轻松地验证公式是否已正确转换为代码。还要考虑是否应该用命名常量替换其中一些数字文字,以进一步提高可读性。在不知道上下文的情况下,它看起来很多"magic numbers".