为何C语言使用math.h的pow计算pow(10,18)+1结果与预期不符
问题原因
pow()是<math.h>中定义的浮点数计算函数,返回值为double双精度浮点数类型,本身就不是为精确整数计算设计的。- 双精度浮点数的有效精度只有53个二进制位,对应十进制大约15~17位有效数字,仅能精确表示
[-2^53, 2^53]范围内的整数,超过这个范围的整数无法被逐个精确存储。 - 10^18 已经超出了双精度浮点数的精确整数表示范围,此时
pow(10,18) + 1作为浮点数运算,加1的操作不会改变该量级下的浮点数存储值,计算结果仍为1000000000000000000.0,赋值给long long类型后自然就得到了你看到的输出。
修复方案
如果要计算大整数幂,不要使用浮点数函数pow,自己实现整型幂运算即可,示例如下:
#include <stdio.h> long long long_pow(long long base, int exp) { long long res = 1; for (int i = 0; i < exp; i++) { res *= base; } return res; } int main(void){ long long n = long_pow(10,18) + 1; printf("%lld ", n); }
内容的提问来源于stack exchange,提问作者Gendozz
相关产品推荐
相关产品推荐

