首页
社区
课程
招聘
[求助]浮点打印结果不一!?
发表于: 2005-2-5 18:52 4472

[求助]浮点打印结果不一!?

4nil 活跃值
13
2005-2-5 18:52
4472
main(){
        unsigned long num=0xFED63690;
        float sn;
        sn=num;

        printf("%f\n",sn);
        printf("%f\n",sn);       
        getch();
}
这断代码,执行显示的数值2次不一样是,什么原因.
不知道在别的机子上是怎么样的.
本机系统XP,用VC++ 6.0编译.

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 176
活跃值: (117)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
怎么可能呢
我的是XP SP2+LCC编译
显示
4275451648.000000
4275451648.000000
2005-2-5 18:57
0
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
3
我的显示
4275451536.000000
4275451648.000000
2005-2-5 20:19
0
雪    币: 176
活跃值: (117)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
你用VC单步跟一下吧
我也认为应该是
4275451536.000000
可能是类型转换精度不同造成的吧
2005-2-5 20:26
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
5
就是这句:unsigned long num=0xFED63690;
后面又将它赋值给float,类型不一致,可能会导致数据丢失。
2005-2-5 20:31
0
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
6
最初由 prince 发布
就是这句:unsigned long num=0xFED63690;
后面又将它赋值给float,类型不一致,可能会导致数据丢失。

丢失的话,2次打印也应该一样啊,因为赋值在打印之前啊.
打印是执行了2遍,丢失也是在打印之前,不应该不一样的,后面的值不会变的吧.
2005-2-5 21:14
0
雪    币: 176
活跃值: (117)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
也算是VC的Bug吧
你可以用其他编译器编译看结果
确实是在打印前丢失的
2005-2-5 21:18
0
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
8
请看图
2005-2-5 21:21
0
雪    币: 176
活跃值: (117)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
用TC吧
相信应该是最权威的
TC显示的是丢失数据后的sn
2005-2-5 21:37
0
雪    币: 212
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
Vc6.0 release版没这个问题,DEBUG有。下面是DEBUG的汇编。

004011CF   mov         eax,dword ptr [ebp-4]
004011D2   mov         dword ptr [ebp-10h],eax
004011D5   mov         dword ptr [ebp-0Ch],0
004011DC   fild        qword ptr [ebp-10h]
004011DF   fst         dword ptr [ebp-8]        ------->注意是dwrod
19:
20:     printf("%f\n",sn);
004011E2   sub         esp,8
004011E5   fstp        qword ptr [esp]         -------->注意是qword
004011E8   push        offset string "%f\n" (00424028)
004011ED   call        printf (00401310)
004011F2   add         esp,0Ch
21:     printf("%f\n",sn);
004011F5   fld         dword ptr [ebp-8]      --------->注意是dwrod
004011F8   sub         esp,8
004011FB   fstp        qword ptr [esp]       ---------->qwrod
004011FE   push        offset string "%f\n" (00424028)
00401203   call        printf (00401310)
00401208   add         esp,0Ch
22:       return 0;
0040120B   xor         eax,eax

把SN声明为DOUBLE就没有这个问题。可能是VC的一个BUG吧。
2005-2-5 22:30
0
雪    币: 519
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
11
遇到莫名其妙的问题就得靠汇编了,CPU执行的机器码不会骗人,这是我一贯的观点
2005-2-5 23:37
0
雪    币: 204
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
你再连续多放置几个printf("%f\n",sn);看看微软能创造什么奇迹!
2005-2-6 10:40
0
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
13
后面就不变了,一直是4275451648.000000
2005-2-6 11:11
0
雪    币: 204
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
004011CF   mov         eax,dword ptr [ebp-4]
004011D2   mov         dword ptr [ebp-10h],eax
004011D5   mov         dword ptr [ebp-0Ch],0
004011DC   fild        qword ptr [ebp-10h]
004011DF   fst         dword ptr [ebp-8]        ------->注意是dwrod  精度低于 004011E5  fstp qword ptr [esp] 产生了低精度的种子
19:
20:     printf("%f\n",sn);
004011E2   sub         esp,8
004011E5   fstp        qword ptr [esp]         -------->注意是qword
004011E8   push        offset string "%f\n" (00424028)
004011ED   call        printf (00401310)
004011F2   add         esp,0Ch
21:     printf("%f\n",sn);
004011F5   fld         dword ptr [ebp-8]      --------->注意是dwrod    由于采用低精度的种子
004011F8   sub         esp,8
004011FB   fstp        qword ptr [esp]       ---------->qwrod          回天无力
004011FE   push        offset string "%f\n" (00424028)
00401203   call        printf (00401310)
00401208   add         esp,0Ch
22:       return 0;
0040120B   xor         eax,eax

总的来看,前一个结果应是Double的吧,精度高于后边的,应该说,结果都不错,大概是微软的员工恨铁不成钢,跟精度犯急了!

引用了楼上的资料,特此声明!
2005-2-7 23:50
0
游客
登录 | 注册 方可回帖
返回
//