CString str;
float f1,f2,f3,f4,tf1,tf2;
f1 = 4E13;
f2 = 3.0;
f3 = 7E6;
f4 = 5.9E6;
tf1 = f1*(f3-f4)/(f2*f3*f4);
tf2 = f1*(f3-f4)/(f2*f3*f4);
str.Format("Period : %f,%f,%f\r\n",tf1,tf2,tf2-tf1);
AfxMessageBox(str);以上这段代码输出的结果:
Test result: tf1=355125.093750,tf2=355125.093750,tf2-tf1=0.001029
为什么会出现 tf2-tf1 非零?
如果将 float改为 double,tf2-tf1=0.000000
另,如果在 str.Format前面任意 进行一次 float类型数据的运算,也能使得 tf2-tf1=0.00000. 这又是怎么一回事?
请高人指点
编译环境:VC6,sp5 + XP,sp1
float f1,f2,f3,f4,tf1,tf2;
f1 = 4E13;
f2 = 3.0;
f3 = 7E6;
f4 = 5.9E6;
tf1 = f1*(f3-f4)/(f2*f3*f4);
tf2 = f1*(f3-f4)/(f2*f3*f4);
str.Format("Period : %f,%f,%f\r\n",tf1,tf2,tf2-tf1);
AfxMessageBox(str);以上这段代码输出的结果:
Test result: tf1=355125.093750,tf2=355125.093750,tf2-tf1=0.001029
为什么会出现 tf2-tf1 非零?
如果将 float改为 double,tf2-tf1=0.000000
另,如果在 str.Format前面任意 进行一次 float类型数据的运算,也能使得 tf2-tf1=0.00000. 这又是怎么一回事?
请高人指点
编译环境:VC6,sp5 + XP,sp1
Period : 355125.093750,355125.093750,0.000000
float f1;
if(f1 == 0) if(f1 != 0)?
这样做嘛?错,这样做是不准确的,浮点型一定是相对,记住,应该如下:
#define HHH 0.00001 //我要要精确到0.00001
if(((f1 - HHH) > 0) || ((f1 - HHH) < 0)) //这才是不等0的判断
等于0的就不说了。
不知道你明白不明白我的意思了。用浮点型要用好是别那么草率的,否则有些值是骗你的。
是编译器问题了~~
我用VC6.0编译结果和楼主相同~~
用VC7.0结果同楼上相同~~~
本身double精度就比较高~~
勾选 Project Settings-->C/C++ -->Optimizations-->Customize-->Inprove Flat Consistency (或直接在 Options 里添加开关 /Op )
即避免了该问题,谢谢!Microsoft Visual C++ 浮点优化:
http://www.microsoft.com/china/MSDN/library/langtool/VCPP/USdv_vstechartfloapoint.mspx?mfr=true