[英]C float and double comparisons
我正在比较C中的简单浮点数和双精度数,特别是它们的值8.7。 现在,我为每个变量分配8.7,在打印时,两个值的结果均为8.7000。 为什么编译器添加了这些零。 我想问的主要问题是,还有其他我看不到的数字,例如隐藏在尾随零后面的数字。 我读到,由于缺乏精度,我不应该对float进行这样的比较,但是我认为,以如此小的值,它肯定可以存储8.7,并将其自身与另一个8.7值进行比较所需的精度如何?
我唯一担心的是它实际上在内存中的某个位置表示为8.70000003758之类的东西,这使我无法进行比较了吗? 我尝试使用%.20f进行printf,以查看可能隐藏的其他任何数字,但我认为只是创建了一些数字,否则这些数字将不存在,因为数字的整体精度更改为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进行printf,以查看可能隐藏的其他任何数字,但我认为只是创建了一些数字,否则这些数字将不存在,因为数字的整体精度更改为8.6918734634834929或类似的数字。
那可能只是一个错误。 向我们展示该代码。 也许您试图输出一个double并忽略了l
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.