首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-08-09 
浮点数与整形的转换问题#includeiostreamusing namespace stdint main(){int x 0x75678976if(x (

浮点数与整形的转换问题
#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]  
}


热点排行
Bad Request.