|
发表于 2019-6-4 14:49:03
|
显示全部楼层
本帖最后由 Croper 于 2019-6-4 14:52 编辑
- #include <stdio.h>
- #include <math.h>
- main()
- {
- int i;
-
- unsigned long long sum = 0;
-
- for ( i = 0; i < 64; i++ ){
-
- sum = sum + (unsigned long long)pow(2, i); //这里加一个unsigned long long
- }
-
- printf( "舍罕王应该给予达依尔%llu粒麦子。\n", sum );
- printf( "如果每25000粒麦子为1kg,那么应该给%llukg麦子", sum / 25000 );
-
- return 0;
- }
复制代码
等于0的原因是因为这道题的答案是2^64-1,刚好是unsigned long long的上界
而pow函数的返回值是double类型,那么运行时,等式右边的结果也是double类型,自动转换为unsigned long long,再赋值给sum,
但是double类型的分数位只有52位,换句话说,其精度大概只有16到17位,其并不能精确地表示2^64-1,换算后,可能近似为2^64,那么对于unsigned long long就直接溢出为0了
处理方法就是先把pow的结果转换为unsigned long long(double对于其表示范围内的2的整数次方总是能精确表示的),再行计算,就不存在近似的问题了 |
|