所以我刚刚在我的代码中发现了这个错误,我想知道我不理解哪些规则。
我有一个 float
变量 logDiff,它目前包含一个非常小的数字。我想看看它是否大于常量表达式(12 的 80%)。多年前,我在 Code Complete 中读到,为了便于阅读,只保留最简单形式的计算常量,编译器 (XCode 4.6.3) 无论如何都会将它们内联。所以我有,
if ( logDiff > 1/12 * .8 ) {
我假设 .8 和分数的计算结果都是正确的。看起来合法:
(lldb) expr (float) 1/12 * .8
(double) $1 = 0.0666666686534882
(lldb) expr logDiff
(float) $2 = 0.000328541
但它总是错误地计算为真。即使我弄乱了括号之类的东西。
(lldb) expr logDiff > 1/12 * .8
(bool) $4 = true
(lldb) expr logDiff > (1/12 * .8)
(bool) $5 = true
(lldb) expr logDiff > (float)(1/12 * .8)
(bool) $6 = true
我发现我必须明确地将其中至少一个拼写为 float 才能获得正确的结果,
(lldb) expr logDiff > (1.f/12.f * .8f)
(bool) $7 = false
(lldb) expr logDiff > (1/12.f * .8)
(bool) $8 = false
(lldb) expr logDiff > (1./12 * .8f)
(bool) $11 = false
(lldb) expr logDiff > (1./12 * .8)
(bool) $12 = false
但我最近读了a popular style guide明确避开这些更花哨的数字文字,显然是根据我的假设,即编译器会比我更聪明,并且会按我的意思去做。
如果我的数字常量可能需要是 float ,我是否应该始终将它们拼写为 1.f
?听起来很迷信。帮助我了解为什么以及何时需要?
表达式 1/12
是一个整数 除法。这意味着结果将被截断为零。
当您执行 (float) 1/12
时,您将其转换为 float ,整个表达式变为浮点表达式。
我是一名优秀的程序员,十分优秀!