读书人

浮点数与整形的转换有关问题

发布时间: 2013-08-09 15:16:24 作者: rapoo

浮点数与整形的转换问题
#include<iostream>

using namespace std;

int main(){
int x = 0x75678976;
if(x == (int)(float)x){
cout << "TRUE\n";
}
else{
cout << "FALSE\n";
}
return 0;
}
运行结果是TRUE

代码如上,个人觉得依据整形转化为浮点型的原则(既然整形的位数已经超过了23位)那么在转为float时会有精度的损失,为什么在重新强制转化为Int后,又没有损失了呢?谢谢
[解决办法]
(int)(float)x可能没做float的强制转换,改成
int x = 0x75678976;
float fvalue =(float)x;
if(x == (int)fvalue)
就打印FALSE了
[解决办法]

引用:
(int)(float)x可能没做float的强制转换,改成
int x = 0x75678976;
float fvalue =(float)x;
if(x == (int)fvalue)
就打印FALSE了

编译优化,把强制转换优化掉了。
变成
if(x == x){
cout << "TRUE\n";
}
else{
cout << "FALSE\n";
}
return 0;
当然是输出TRUE了
[解决办法]
可能被优化了,甚至不用比较。
nt main()
{
00CE1270 push ebp
00CE1271 mov ebp,esp
00CE1273 and esp,0FFFFFFF8h
int x = 0x75678976;
if(x == (int)(float)x)
{
std::cout << "TRUE\n";
}
else
{
std::cout << "false" << std::endl;
00CE1276 push dword ptr ds:[0CE3038h]
00CE127C mov edx,0CE3168h
00CE1281 push ecx
00CE1282 mov ecx,dword ptr ds:[0CE304Ch]
00CE1288 call std::operator<<<std::char_traits<char> > (0CE1730h)


00CE128D add esp,4
00CE1290 mov ecx,eax
00CE1292 call dword ptr ds:[0CE3030h]
}


读书人网 >C++

热点推荐