我在比较C中的简单浮点数和双精度数,特别是两者的值8.7。 现在我为每个变量分配8.7,当我打印时,我得到两个值的8.7000的结果。 为什么编译器添加了这些零。 我想问的主要问题是还有任何我没有看到的数字,如隐藏在尾随零之后的数字。 我读到由于缺乏精确度,我不应该使用float进行这样的比较,但是我认为它具有如此小的值,它确实可以存储8.7,并且需要一定程度的精确度来与另一个8.7值进行比较?
我唯一担心的是它实际上是在内存中的某个位置表示为例如8.70000003758或其他东西,这会让我的比较失败? 我试图使用%.20f打印f以查看可能隐藏的任何其他数字,但我认为只是创建了数字,否则不存在,因为数字的整体精确度变为8.6918734634834929或类似的东西。
我在比较C中的简单浮点数和双精度数,特别是两者的值8.7。
糟糕的选择,因为8.7没有精确的二进制表示。
现在我为每个变量分配8.7,当我打印时,我得到两个值的8.7000的结果。 为什么编译器添加了这些零。
它还没有,你的打印程序有。
我想问的主要问题是还有任何我没有看到的数字,如隐藏在尾随零之后的数字。
当然,因为8.7没有精确的二进制表示。 (尝试将其写为2的整数幂的总和,你不能这样做。)
我读到由于缺乏精确度,我不应该使用float进行这样的比较,但是我认为它具有如此小的值,它确实可以存储8.7,并且需要一定程度的精确度来与另一个8.7值进行比较?
你错了。 1/3很小但没有具有有限位数的精确十进制表示。 值是大还是小与它是否可以用特定基数中的有限位数精确表示无关。
我唯一担心的是它实际上是在内存中的某个位置表示为例如8.70000003758或其他东西,这会让我的比较失败?
确切地说,就像0.333333333
代表1/3一样。
我试图使用%.20f打印f以查看可能隐藏的任何其他数字,但我认为只是创建了数字,否则不存在,因为数字的整体精确度变为8.6918734634834929或类似的东西。
那可能只是一个bug。 向我们展示代码。 也许你试图输出一个双重而遗漏了l
。
以上就是c/c++开发分享C浮点和双重比较相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/519455.html