c语言里一个很奇怪的小问题 真心请教 希望大家指教一下 谢谢~~

wing_0706 2009-07-12 07:03:15
#include "stdio.h"
main()
{
float x;
for(x=0;x<=1.0;x+=0.1)
printf("%.1f ",x);
}
运行结果是:0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
为什么 1.0 没有啊?
#include "stdio.h"
main()
{
float x;
for(x=0;x<=10.0;x+=1)
printf("%.1f ",x);
}
运行结果:0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
为什么这个 10.0却又出来了...
这两个函数有本质的区别吗,应该没有吧怎么会得到这样的结果
真心请教谢谢~!
...全文
45 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
laji1332 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 billow_zhang 的回复:]
对于浮点数,由于其表达使用的是有效数和幂次方的表达方式,所以在进行运算的时候,需要进行规格化,从而产生精度以外的偏差.所以使用浮点数,是不能进行是否相等的比较的.一般应根据应用使用绝对值小于或大于某个满足应用的值.
例如:判断浮点数是否小于零,应该使用 if ( fabs(x) < MIN_VALUE ). MIN_VALUE 应该根据应用的精度定义,例如可能是: 000001 或者是 0.000000001.

我将楼主的第一个程序,修改一下,将x打印出10位小数点…
[/Quote]受教了,谢谢。
wing_0706 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 billow_zhang 的回复:]
对于浮点数,由于其表达使用的是有效数和幂次方的表达方式,所以在进行运算的时候,需要进行规格化,从而产生精度以外的偏差.所以使用浮点数,是不能进行是否相等的比较的.一般应根据应用使用绝对值小于或大于某个满足应用的值.
例如:判断浮点数是否小于零,应该使用 if ( fabs(x) < MIN_VALUE ). MIN_VALUE 应该根据应用的精度定义,例如可能是: 000001 或者是 0.000000001.

我将楼主的第一个程序,修改一下,将x打印出10位小数点…
[/Quote]
谢谢谢谢谢谢~~~~~!!!!
billow_zhang 2009-07-12
  • 打赏
  • 举报
回复
对于浮点数,由于其表达使用的是有效数和幂次方的表达方式,所以在进行运算的时候,需要进行规格化,从而产生精度以外的偏差.所以使用浮点数,是不能进行是否相等的比较的.一般应根据应用使用绝对值小于或大于某个满足应用的值.
例如:判断浮点数是否小于零,应该使用 if ( fabs(x) < MIN_VALUE ). MIN_VALUE 应该根据应用的精度定义,例如可能是: 000001 或者是 0.000000001.

我将楼主的第一个程序,修改一下,将x打印出10位小数点数,可以发现其中的奥秘:

#include <stdio.h>

int
main(int argc, char **argv)
{
float x;

for(x = 0; x <= 1.0; x += 0.1)
printf("%.10f ",x);

printf("\n%.10f\n\n", x);

return 0;
}

运行结果是:
0.0000000000 0.1000000015 0.2000000030 0.3000000119 0.4000000060 0.5000000000 0.6000000238 0.7000000477 0.8000000715 0.9000000954
1.0000001192

由于 float的精度问题,它不能保证它精度以外的正确性. 可以看出它在进行第一次循环的时候, x的值实际上为0.1000000015,并非是你想象的0.1,也不是 0.1000000000.
在最后一次循环的时候,它已经是 1.0000001192, 当然这个数值使得 x <= 1.0不成立,所以,不会循环.

当然,这并非说浮点数运算不准确和不可靠.它只能保证它精度范围内正确.如果,你使用了它精度外的特性值去想当然的编写程序,结果将会与你想象的逻辑大相径庭.

对于第二种情况:
for( x = 0; x <= 10.0;x += 1 )

由于你的精度要求没有第一种情况那么高,侥幸结果与你想象的一致.


对于楼主的程序的逻辑,可以进行如下修改:

第一种情况:
for ( x = 0; x < 1.01; x += 0.1 )


第二种情况:
for ( x = 0; x < 10.01; x += 1.0 )

wing_0706 2009-07-12
  • 打赏
  • 举报
回复
真的很感谢你们!~!!!
blh 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wing_0706 的回复:]
那 float 和double  为什么有这样的区别啊
[/Quote]

float为单精度浮点数,double为双精度浮点数,float类型4个字节,double类型8个字节
wing_0706 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 blh 的回复:]
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0

我这里正常,MinGW编译,Vista下运行
[/Quote]
啊 谢谢你们了 这个还跟编译器有关啊
那 float 和double 为什么有这样的区别啊
blh 2009-07-12
  • 打赏
  • 举报
回复
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0

我这里正常,MinGW编译,Vista下运行
wing_0706 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 blh 的回复:]
试一下 double x;
[/Quote]
用double 真的多了一个 1 可是不是1.0 这个又是为什么啊 ??不好意思啊 我是c初学者
wing_0706 2009-07-12
  • 打赏
  • 举报
回复
那是不是 在第一个程序里 1.0是有可能 被输出 的 只不过浮点数一般都 误差啊?
blh 2009-07-12
  • 打赏
  • 举报
回复
试一下 double x;
Walf_ghoul 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liao05050075 的回复:]
浮点数在计算机中的表示是不精确的,也就是说,0.9+0.1可能会变成1.0000001,于是,1.0没有输出来。
[/Quote]
这个很能说明问题!
genganpeng 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liao05050075 的回复:]
浮点数在计算机中的表示是不精确的,也就是说,0.9+0.1可能会变成1.0000001,于是,1.0没有输出来。
[/Quote]
这种解释应该是对的!!1.00001 > 1.0所以没有输出1.0
wing_0706 2009-07-12
  • 打赏
  • 举报
回复
是啊 为什么啊??
laji1332 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Walf_ghoul 的回复:]
用浮点数做这种比较偏差很大的。。。
[/Quote]
浮点数确实偏差很大,但那是以为他去有效的7位数字输出如果两个相差很大的数如12345678900与20相加,20相对来说就没有意义了
但楼主的运算都是在非常接近的数字之间进行的
为什么还会出现这种情况?
liao05050075 2009-07-12
  • 打赏
  • 举报
回复
浮点数在计算机中的表示是不精确的,也就是说,0.9+0.1可能会变成1.0000001,于是,1.0没有输出来。
Walf_ghoul 2009-07-12
  • 打赏
  • 举报
回复
用浮点数做这种比较偏差很大的。。。
zhao1zhong6 2009-07-12
  • 打赏
  • 举报
回复
#include "stdio.h" 
#include <iostream>
main()
{
float x;
for(x=0;x <=1.01;x+=0.1)
printf("%.1f ",x);
system("pause");
}

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧