浮点数问题
- #include <stdio.h>
- int main(int argc, char *argv[])
- {
- double d1 = 1.00000000000000008;
- double d2 = 1.00000000000000007;
- if (d1 == d2)
- {
- printf("相等\n");
- }
- else
- {
- printf("不相等\n");
- }
- return 0;
- }
复制代码
- #include <stdio.h>
- int main(int argc, char *argv[])
- {
- double d1 = 0.00000000000000008;
- double d2 = 0.00000000000000007;
- if (d1 == d2)
- {
- printf("相等\n");
- }
- else
- {
- printf("不相等\n");
- }
- return 0;
- }
复制代码0.00000000000000008
0.00000000000000007
1.00000000000000008
1.00000000000000007
为什么两组数据相比结果不一样?
谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
double好像只能存15位有效数字.所以1.00000000000000007 和1.00000000000000008被截断了存到变量中(这样说其实不是很准确,但估且这样理解).所以两者值是一样的.
到于0.00000000000000008和0.00000000000000007则不存在这个问题.
本帖最后由 noword2k 于 2011-04-13 15:36 编辑
浮点数要这样比较是否相等:
if ( fabs(float1 - float2) < EPSLION )
{
....
}
EPSLION的define,看这里
http://en.wikipedia.org/wiki/Machine_epsilon
回复 1# shihyu
double 占 8 byte. 是 64 bit.
最多 可以表示 2^64 个数字,也就 lg2 =0.3010 0.3010*64=19.264.
所以最多 可以表示不超过 10^20 个不同的数字, 其中 一部分用来表示 阶, 另一部分用来表示有效数字。
所以上边的, 因为位数多, 后边的位不在表示范围内
本帖最后由 shihyu 于 2011-04-15 15:22 编辑
0.00000000000000008
0.00000000000000007
1.00000000000000008
1.00000000000000007
我不明白的是他们小数位都是一样但为什么比对结果不同?
两组小数位都是
00000000000000008
00000000000000007
0.00000000000000008
0.00000000000000007
好像超过小数15~16有效位还是可以检查出来?
回复 5# pmerofc
如果还 64bit 的系统, sizeof(double)==16, 那上边的应该相等
本帖最后由 shihyu 于 2011-04-15 16:30 编辑
#include <stdio.h>
int main(int argc, char *argv[])
{
float d1 = 0.000000000000000000000000000000001;
float d2 = 0.000000000000000000000000000000008;
if (d1 == d2)
{
printf("相等\n");
}
else
{
printf("不相等\n");
}
return 0;
}
一样出现不相等 float 有效位应该只有 5~6位吧
哪个编译器是这样的?{:3_184:}