能力值:
( LV6,RANK:90 )
|
-
-
2 楼
怎么可能呢
我的是XP SP2+LCC编译
显示
4275451648.000000
4275451648.000000
|
能力值:
( LV12,RANK:530 )
|
-
-
3 楼
我的显示
4275451536.000000
4275451648.000000
|
能力值:
( LV6,RANK:90 )
|
-
-
4 楼
你用VC单步跟一下吧
我也认为应该是
4275451536.000000
可能是类型转换精度不同造成的吧
|
能力值:
( LV12,RANK:660 )
|
-
-
5 楼
就是这句:unsigned long num=0xFED63690;
后面又将它赋值给float,类型不一致,可能会导致数据丢失。
|
能力值:
( LV12,RANK:530 )
|
-
-
6 楼
最初由 prince 发布 就是这句:unsigned long num=0xFED63690; 后面又将它赋值给float,类型不一致,可能会导致数据丢失。
丢失的话,2次打印也应该一样啊,因为赋值在打印之前啊.
打印是执行了2遍,丢失也是在打印之前,不应该不一样的,后面的值不会变的吧.
|
能力值:
( LV6,RANK:90 )
|
-
-
7 楼
也算是VC的Bug吧
你可以用其他编译器编译看结果
确实是在打印前丢失的
|
能力值:
( LV12,RANK:530 )
|
-
-
8 楼
请看图
|
能力值:
( LV6,RANK:90 )
|
-
-
9 楼
用TC吧
相信应该是最权威的
TC显示的是丢失数据后的sn
|
能力值:
( 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吧。
|
能力值:
( LV12,RANK:650 )
|
-
-
11 楼
遇到莫名其妙的问题就得靠汇编了,CPU执行的机器码不会骗人,这是我一贯的观点
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
你再连续多放置几个printf("%f\n",sn);看看微软能创造什么奇迹!
|
能力值:
( LV12,RANK:530 )
|
-
-
13 楼
后面就不变了,一直是4275451648.000000
|
能力值:
( 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的吧,精度高于后边的,应该说,结果都不错,大概是微软的员工恨铁不成钢,跟精度犯急了!
引用了楼上的资料,特此声明!
|
|
|