读书人

请问个long 型的乘法在32位下计算结果

发布时间: 2013-10-18 20:53:13 作者: rapoo

请教个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

读书人网 >C语言

热点推荐