奇怪的float问题
[顶]float的奇怪现象
发表时间:2007年11月24日 19时56分9秒 评论/阅读(0/0)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <iomanip.h>
using namespace std;
int main()
{
float temp = 123.456f;
cout<<"float temp = 123.456f"<<endl;
cout<<" sizeof temp is : "<<sizeof(temp)<<endl;
cout<<" using cout : "<<oct<<temp<<endl;
printf(" using printf : %f\n",temp);
if(temp ==123.456f)cout<<"equality 123.456f"<<endl;
else
if(temp == 123.456 )cout<<"equality 123.456"<<endl;
float temp2 = 123.456;
cout<<"float temp2 = 123.456"<<endl;
cout<<" using cout : "<<temp2<<endl;
printf(" using printf : %f\n",temp2);
if(temp2 ==123.456f)cout<<"equality 123.456f"<<endl;
else
if(temp2 == 123.456 )cout<<"equality 123.456"<<endl;
if(temp==temp2)cout<<"temp equality temp2"<<endl;
else cout<<"no equality"<<endl;
return 1;
}
/*
执行结果:
float temp = 123.456f
sizeof temp is : 4
using cout : 123.456
using printf : 123.456001
equality 123.456f
float temp2 = 123.456
using cout : 123.456
using printf : 123.456001
equality 123.456f
temp equality temp2
*/
结果奇怪吧。。
首先对于temp来说,既然等于的是123.456f,为何在使用printf输出的时候会有不同的结果?在判断的时候temp的数值与123.456f相同,但是,为啥与123.456不同呢?
其次对于temp2来说,使用的是123.456来初始化,结果temp的数值还是与123.456f相同。
这是什么回事呀?大家讨论下,我都迷惑了。。。123.456与123.456f是不同的????
[解决办法]
浮点数,是不精确的
要判断两个浮点数相等应该是看这两个浮点数的差是否在你控制的精度之内
比如if(f1-f2<0.0000001),可以看做f1==f2
[解决办法]
这个并不奇怪,你用COUT输出的时候只是保留六位有效数字,而用PRINTF输出的时候是六位小数,这是因为FLOAT型储存的时候小数转换为二进制数引起的,你可以去查看一下小数是如何转换为二进制数的
[解决办法]
愿闻其详?
[解决办法]
float和double不是精确的数
详情参照IEEE754标准
http://blog.csdn.net/bossin/archive/2007/04/05/1552705.aspx