【虚心请教】关于浮点类型异常的问题
时间:2008-05-14 10:37:32
来源:论坛整理 作者: 编辑:chinaitzhe
#include "stdio.h"
void main()
{
float sum,i;
sum=0;
int j=1;
printf("%d%f=====\n",sum);
for(i=1;i <=3;i =0.1f)
printf("%f,(%d)\n",i,j );
}
网友回复:printf("%d%f=====\n",sum); 少个参数
红线在哪里?
网友回复:抱歉图没发出来,其内容如下:
1.000000,(1)
1.100000,(2)
1.200000,(3)
1.300000,(4)
1.400000,(5)
1.500000,(6)
1.600000,(7)
1.700000,(8)
1.800000,(9)
1.900000,(10)
2.000000,(11)
2.100000,(12)
2.200000,(13)
2.300000,(14)
2.400000,(15)
2.500000,(16)
2.600000,(17)
2.700000,(18)
2.799999,(19)---------------------------------erroe
2.899999,(20)
2.999999,(21)
网友回复:#include "stdio.h"
void main()
{
float sum = 0,i =0;
sum=0;
int j=1;
printf("%f=====\n",sum );
for(i=1;i <=3;i =0.1f)
printf("%f,(%d)\n",i,j );
}
网友回复:
那句话被注释掉了抱歉没复制上注释符号、
网友回复:浮点数用%F输出,用%D的话,会进行截断,输出的肯定不是你想要的结果
printf("%d%f=====\n",sum); ========>printf("%f=====\n",sum);
分析那句话printf("%d%f=====\n",sum); //因为SUM占8个字节,而%D是四个字节,所以会将SUM的内存区分成两半,一半用%D来输出,另一半用%F输出
网友回复:这是因为浮点数储存的时候是以指数形式储存,前半部分是小数,储存的时候有可能会出现误差,所以有关符点数的运算存在精度问题,所以会出现上面的误差
网友回复:抱歉我不能在原来的帖子上修改(权限不够),我把程序重新整理了一下:
#include "stdio.h"
void main()
{
float sum,i;
sum=0;
int j=1;
for(i=1;i <=3;i =0.1f)
printf("%f,(%d)\n",i,j );
}
结果:
1.000000,(1)
1.100000,(2)
1.200000,(3)
1.300000,(4)
1.400000,(5)
1.500000,(6)
1.600000,(7)
1.700000,(8)
1.800000,(9)
1.900000,(10)
2.000000,(11)
2.100000,(12)
2.200000,(13)
2.300000,(14)
2.400000,(15)
2.500000,(16)
2.600000,(17)
2.700000,(18)
2.799999,(19)---------------------------------erroe
2.899999,(20)
2.999999,(21)
我没有别的意思,也许您的时间很宝贵,但你至少看看我 的程序,你会发现你的回答跟我的问题毫不相干(dbger),
我的结果是运行过的,不信您可以试一试
期待您的解答谢谢!非常感谢!
网友回复:float的精度只有6位,而double的精度有14位,
将i定义为double就不会有问题了,
或者只输出小数点后5位 printf("%0.5f,(%d)\n",i,j );
网友回复:有意思,关注中!
网友回复:事情是这样的,我在做仿真方面的问题,需要从数据(文件的字符串中)中读出坐标(要求必须这么做),而且坐标类型是FLOAT型的 。有没有一种方法可以决绝这种异常啊,方法是什么啊,虚心求教。
网友回复:6楼8楼的回答得对,精度问题。换成double
网友回复:但是我要的在结果是FLOATL类型的,强制转化成double不会有问题吗(截取)
期待结局方法。。
网友回复:刚刚打错了
但是我要的在结果是FLOATL类型的,double强制转化成float不会有问题吗(截取)
期待解决方法。。
网友回复:感谢6。8。11.楼的回答结贴时我会给加分的,
抱歉 我又单步调试了一下发现在监测时变量的值是对的,问题处在输出上,我想问的是,是不是,这种事情只发生在输出上啊(可能是格式符的问题),在赋值时是不是,不会出现这种问题啊,
比如i=2.8,但输出时是2.799999,(上面的那个例子);
我把它付给j,那j的值是2.799999,还是 2.8啊 ?
虚心请教,谢谢!
网友回复:你的这个地方的I是经过很多次加法的,浮点数的加法多多少少会出现一点误差,这个误差很小,比如每次的误差是0.0000001,进行10次后,就可能有0.000001,进行更多次就更不用说了...,不过不管进行多少次,这个误差不会太大,因为误差有可能是正,有可能是负,中间可能会抵消一部分
网友回复:我已经搞清楚了,是这样以%f格式输出的数精确到小数点后六位,而FLOAT类型只精确六位有效数字,
例子:float i=90;
printf("%f",i);
结果输出90.000001(我只是举个例子结果可能不是这个)
分析:
FLOAT类型精确六位有效数字,就是说只精确到90.0000,而后面的01是无意义的数,因为是按%f输出的
(%f格式输出的数到小数点后六位)至于在程序中会不会有影响,似乎不会吧,因为只是输出格式的问题,调试中变量的只是对的。
感谢6。8。11.楼的回答我以给加分
关键字:虚心,请教,浮点,类型,异常,
上一篇:c 如何获取一个打印机的句柄
下一篇:下面没有链接了











文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面