gpt4 book ai didi

objective-c - 为什么某些 C 数学表达式需要将常量显式标记为 float ?

转载 作者:太空宇宙 更新时间:2023-11-04 00:38:42 25 4
gpt4 key购买 nike

所以我刚刚在我的代码中发现了这个错误,我想知道我不理解哪些规则。

我有一个 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 ,整个表达式变为浮点表达式。

关于objective-c - 为什么某些 C 数学表达式需要将常量显式标记为 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18226370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com