繁体   English   中英

C浮点和双重比较

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM