读书人

float 的误差有关问题

发布时间: 2012-02-04 15:43:09 作者: rapoo

float 的误差问题?
#include< iostream >
using namespace std;
int main()
{
float a,b,c;
a = 1.1;
b = a;
b++;
//cout << b << endl;
b--;
if( a == b )
cout << "a == b " << endl;
else
cout << "a != b " << endl;
return 0;
}
为什么cout<< b << endl;前面的//去掉后就是a!=b.不去掉的话就是a==b???

[解决办法]
我用的code:block测试的结果是
加不加cout<< b << endl; 结果都是a!=b
个人认为是因为float的尾数部分左移或者右移之后会发生微小的变化,所以会发生a!=b的情况。

在float或double情况下,当需要判断两个值a、b是否相等时,基本是这么判断fabs(a - b) < 0.01等等
讲这些不知能不能帮上lz
[解决办法]

C/C++ code
#include< iostream >using namespace std;int main(){  float a,b,c;  a = 1.1;  b = a;  b++;  //cout << b << endl;  b--;  if( a == b )   cout << "a == b " << endl;   else     cout << "a != b " << endl;   return 0;}
[解决办法]
探讨
C/C++ code

#include< iostream >
using namespace std;
int main()
{
float a,b,c;
a = 1.1;
b = a;
b++;
//cout << b << endl;
b--;
if( a == b )
cout << "a == b " << endl;
……

[解决办法]
没办法,浮点数就有这样的问题,因为有一部分表面看来小数位数很少的浮点数,
实际上却无法在计算机中用32位或64位二进制来精确表示,再经过运算,可能使
误差累积,所以应该尽量避免去判断两个浮点数是否严格相等。

在这个例子中,把b++和b--的先后顺序换一下,可能结果都不一样。

[解决办法]
5: float a,b,c;
6: a = 1.1;
00401588 mov dword ptr [ebp-4],3F8CCCCDh
7: b = a;
0040158F mov eax,dword ptr [ebp-4]
00401592 mov dword ptr [ebp-8],eax
8: b++;
00401595 fld dword ptr [ebp-8]
00401598 fadd dword ptr [__real@4@3fff8000000000000000 (0046e034)]
0040159E fstp dword ptr [ebp-8]
9: cout << b << endl;
004015A1 push offset @ILT+195(std::endl) (004010c8)
004015A6 mov ecx,dword ptr [ebp-8]
004015A9 push ecx
004015AA mov ecx,offset std::cout (0047be90)
004015AF call @ILT+290(std::basic_ostream<char,std::char_traits<char> >::operator<<) (00401127)
004015B4 mov ecx,eax
004015B6 call @ILT+475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0)
10: b--;
004015BB fld dword ptr [ebp-8]
004015BE fsub dword ptr [__real@4@3fff8000000000000000 (0046e034)]
004015C4 fstp dword ptr [ebp-8]

同意所有楼上的
只要有cout或者其他语句如c=c+1; b由CD CC 8C 3F 变成 CC CC 8C 3F
如果是c;这种没有什么意义的,没问题
[解决办法]
http://www.douban.com/note/30813010/
[解决办法]
比较两个float 类型的变量是否相等的时候,是不能用 == 的。
float a = 1.1;
float b = 1.1;
if( (a - b)< 0.00000001 &&( a-b) > 0.0000001 )
{
//a和b相等
}
else
{
//a和b不相等
}

读书人网 >C++

热点推荐