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

请问个long 型的乘法在32位下计算结果比预期少1的有关问题

2013-10-18 
请教个long 型的乘法在32位下计算结果比预期少1的问题很简单的一个long的运算,为什么64位linux上OK,32位上

请教个long 型的乘法在32位下计算结果比预期少1的问题
很简单的一个long的运算,为什么64位linux上OK,32位上计算的结果少1呢。
    long b = 50000;
    printf("--%ld\n", b);
    long d = (double)b * 0.075;
    printf("--%ld\n", d);


    printf("sizeof(int) %d, sizeof(long) %d\n", sizeof(int), sizeof(long));

结果:
$ ./a.out 
--50000
--3749
sizeof(int) 4, sizeof(long) 4

如果改成下面这样就能正确计算:
    long b = 50000;
    printf("--%ld\n", b);
    double c = ((double)b) * (double)0.075;
    long d = (long)c;
    printf("--%ld\n", d);

$ ./a.out 
--50000
--3750
sizeof(int) 4, sizeof(long) 4


这是为什么呢~~ 很困惑, 求高人指点迷津~~  不知道


应该是类型转换的问题,,,,或者浮点数精度问题,,它可能只是近似值,例如3749.99999,
printf("--%lf\n",  (double)b * 0.075);  这个是正确的

[解决办法]
浮点数计算,会有误差,但是什么情况下,误差多少和运算的数据有关,不是任何时候都是一样的。
误差,不是确定的,只能大概估计,何种情况,误差范围是多少,而不是每次计算的误差都一样。



[解决办法]
64位默认使用sse指令,32位不是,要加参数-march=pentium4(或更高),结果就一样。
[解决办法]

-march=CPU[,+EXTENSION...]
    generate code for CPU and EXTENSION, CPU is one of:
     i8086, i186, i286, i386, i486, pentium, pentiumpro,
     pentiumii, pentiumiii, pentium4, prescott, nocona,
     core, core2, corei7, l1om, k6, k6_2, athlon, k8,
     amdfam10, generic32, generic64
    EXTENSION is combination of:
     8087, 287, 387, no87, mmx, nommx, sse, sse2, sse3,
     ssse3, sse4.1, sse4.2, sse4, nosse, avx, noavx,
     vmx, smx, xsave, movbe, ept, aes, pclmul, fma,
     clflush, syscall, rdtscp, 3dnow, 3dnowa, sse4a,
     svme, abm, padlock, fma4

热点排行