You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:57:00