指数计算器

输入底数 a 与指数 n,实时算出 a 的 n 次方;指数可以是负数或小数,开方写成「指数 ÷ 根次」即可,并直接告诉你结果是精确整数、浮点近似,还是 NaN / Infinity。

提示:三个输入框里按 Enter 都会立即重算;根次填 3、指数填 1,就是在算立方根。

使用方法

  1. 「底数 a」填 2(默认示例),可以是正数、负数、小数或 0;「指数 n」填 10(默认示例),同样允许负数与小数。
  2. 需要开方时用「根次 q」把指数写成分数:底数 8、指数 1、根次 3,算的就是 8 的三分之一一次方,也就是立方根 2。q 默认 1,表示不做开方。
  3. 三个输入框里按 Enter 立即重算,不用去找按钮。结果区第一行是完整精度的值,下面几行解释这个值的状态和等价写法。
  4. 结果上方的「状态」只有四种:有限数、整数但已丢精度、NaN、Infinity。看到 NaN 或 Infinity 不是算错了,而是这一组输入本身越过了双精度能表达的范围。
  5. 点「复制结果」带走当前值;点「载入示例」回到默认的 210 = 1024。下面的对照表可以先「加载更多」再看全,表尾能导出带 BOM 的 CSV,方便直接丢进 Excel。

这个指数计算器能解决什么问题

一是把复利与增长率里的幂算准。存款、房价、用户量按固定比例增长时,最后一期金额就是「初始值 × (1 + 比率)期数」,这里的 (1 + 比率)期数 正是本页算的东西。填底数 1.08、指数 10,直接得到 2.158925 这个倍数。

二是随手开方,不必另找工具。立方根是三分之一次方、四次方根是四分之一次方,把指数写成 1、根次写成 3 或 4 就行。8 开立方得 2,1000 开立方却得 9.999999999999998——这个差值正好用来解释浮点开方的固有误差。

三是提前判断某个式子会不会溢出。做数据建模或写脚本时,3 的 700 次方、1.1 的 8000 次方到底算不算得出来,看结果是不是 Infinity 最快。本页还会反过来告诉你:底数给定时,指数要大到多少才会溢出。

四是复核代码里的 Math.pow。同一个表达式在 JavaScript、Excel、Python 里可能差最后几位,把双方的数字放进本页对一遍,就能确认差异是浮点精度还是代码写错了。

五是处理负指数。2 的负 3 次方不是「负数结果」,而是 1 除以 2 的 3 次方,等于 0.125;结果区会自动把这个换算写出来,避免把符号搞反。

本页不做这些事:不解方程、不做矩阵的幂、不做模幂运算,也不提供超过 53 位精度的大整数精确幂——超过 253 之后整数位就不再逐 1 连续,本页会明确标出「已丢精度」,需要精确大整数请改用 BigInt 或专门的任意精度库。

计算原理:Math.pow、IEEE 754 与上溢阈值

这个指数计算器实际只调用一个函数:Math.pow(a, e),其中 e 由「指数 n ÷ 根次 q」得到,它和运算符写法 a ** e 完全等价。Math.pow 的语义由 ECMAScript 规范给出,而规范本身又直接引用 IEEE 754 的 pow 运算,所以它继承了一整套被人忽略的特殊约定:pow(任意数, 0) = 1(连 NaN 也是 1)、pow(±0, 负数) = ±Infinity、pow(负数, 非整数) = NaN。

关键参数是 e 的取值方式。根次 q 不参与别处,只用于把指数写成 e = n ÷ q。为什么要先做这一次除法,而不是让用户直接填小数?因为 1/3 的小数写法只有 0.3333333333333333 这一种双精度表示,它已经带有约 5.55×10⁻¹⁷ 的偏差;把它显式保留成「1 ÷ 3」可以让人一眼看出这是分数指数而不是随手填的近似值,也方便核对 1000 开立方为什么得不到 10。

负底数为什么直接给 NaN。IEEE 754 的 pow 只对「指数是整数」或「指数对应的分数分母为奇数」这两种情形有实数解,而双精度数一旦写成小数就丢掉了分母信息——0.3333333333333333 无法被识别成 1/3。于是 Math.pow(-8, 1/3) 返回 NaN,尽管 -2 才是数学答案。这是本页最容易被误判成「工具出错」的一条边界。Math.cbrt(-8) 才是需要负数立方根时的正确函数。

上溢阈值是可以算出来的,不是猜的。双精度能表示的最大有限数是 Number.MAX_VALUE = 1.7976931348623157×10³⁰⁸。要让 |a|n 超过它,指数最小取 ceil(log(1.7976931348623157×10³⁰⁸) ÷ log|a|)。以底数 2 为例,这个式子的值是 1024,实测 21023 还能得到 8.98846567431158×10³⁰⁷,21024 就变成 Infinity;底数 10 时门槛是 309,所以 10308 有限、10309 溢出。下边界同理:绝对值小于 Number.MIN_VALUE = 5×10⁻³²⁴ 就下溢,10 的负 324 次方直接变成 0。

精度由尾数决定。双精度有 53 位二进制有效数字,折算成十进制是 53 × log₁₀2 ≈ 15.95 位,所以结果大约 15~17 位有效数字可信。整数一旦超过 253 = 9007199254740992,相邻可表示整数之间的间隔就变成 2,再往上还会继续翻倍。这就是 334 在页面上显示 16677181699666568、而真实值是 16677181699666569 的原因。

完整示例(数值均由 Math.pow 复算)

以下每一组都可以直接填进上面的输入框验证,结果与页面显示完全一致:

把默认示例拆开看:底数 2 是偶数,指数 10 是正整数,210 只有 4 位十进制数,远在 15 位可信区间之内,所以结果没有任何舍入,打印出来就是干净的 1024。这也是判断一次幂运算是否可信最省事的办法——先看结果的有效位数有没有逼近 16 位。

输入范围与特殊值对照表

下表列出这个指数计算器里最常见的特殊组合,按页面规则逐条复算。默认先显示 12 行,点「加载更多」继续展开,表尾可以导出 CSV 或复制 TSV。

底数 a指数 n结果说明
2101024整指数,结果恰好是整数 1024

下面这张表是另一类问题:底数固定时,指数要多大才会把结果顶到 Infinity。门槛值都按 ceil(log(MAX_VALUE) ÷ log|a|) 复算,并逐档验证了「门槛减一」仍然有限:

底数 a溢出的最小整数指数门槛减一时(仍有限)
1.174481.7837187326221501e+308
1.517511.4444527745742028e+308
210248.98846567431158e+307
36471.6608505280233425e+308
45124.49423283715579e+307
54421.761050914342067e+308
63971.405708114831692e+308
73654.1274950888965186e+307
83428.98846567431158e+307
93241.6608505280233425e+308
103091e+308
1001551e+308

两张表要连起来读:底数越大,允许的指数越小。底数从 2 涨到 10,溢出门槛从 1024 掉到 309;继续涨到 100,只剩 155。|a| 小于等于 1 时不存在上溢,只会出现下溢或始终停在 1 附近。

结果边界与舍入

常见问题

为什么 (-8) 的 1/3 次方得到 NaN,而不是 -2?

因为 IEEE 754 的 pow 只在指数为整数时才对负底数给出实数。1/3 存进双精度后是 0.3333333333333333,分母信息丢了,函数无法判断它是不是奇数分母,于是按「负数的非整数次方无定义」返回 NaN。要算负数的立方根,用 Math.cbrt(-8),结果是 -2;本页的处理方式与此一致,不替你做符号推断。

0 的 0 次方到底等于几?

本页按 IEEE 754 的规定返回 1,Math.pow(0, 0) 在浏览器里也是 1。微积分里它是未定式,极限要看趋近路径;但组合数学与幂级数里把 00 记作 1 才不会破坏公式。具体取哪个值取决于你的领域,工具只是忠实执行标准。

1000 开立方为什么得到 9.999999999999998,明明答案是 10?

因为开立方在这里是「先算指数 1÷3 = 0.3333333333333333,再算 Math.pow」。这个指数本身已经比 1/3 小了一点点,得到的 9.999999999999998 与 10 的相对误差约 2×10⁻¹⁶,正是双精度最后一位的量级。需要精确的整数立方根时,请改用 Math.cbrt(1000),它走专门的算法,返回 10。

根次填 1 和指数写成小数有什么区别?

数学上没有区别,都是先算出同一个指数再调用一次 pow。区别只在于可读性:填「指数 1、根次 3」能一眼看出是立方根,而填「指数 0.3333333333333333」看不出分母是几,也容易让人误以为可以精确表示三分之一。超过 1/2、1/4 这类分母是 2 的幂的分数,双精度本来就无法精确表示。

指数最大能填多少?填 100000 会怎样?

指数输入框的允许范围是 -100000 到 100000。填大指数不会报错,但底数绝对值大于 1 时会很快触到上溢线变成 Infinity,页面会明确告诉你这是溢出而不是算错。反过来说,只要 |a| 略大于 1,哪怕指数只有几万,结果也早就不在双精度能表达的范围内了。

为什么 2 的 53 次方之后整数就不准了?

双精度的尾数只有 53 位,能连续表示的整数上限是 253 = 9007199254740992,也就是 JavaScript 里的 Number.MAX_SAFE_INTEGER 加一。超过它以后,相邻两个可表示整数之间的间隔变成 2、4、8……所以 253 再加 1 得到的还是 253。需要精确大整数请用 BigInt。

负指数算出来的结果是负的吗?

不是。a 的负 n 次方等于 1 除以 a 的 n 次方,符号只由底数决定:2-3 = 0.125 是正数,(-2)-3 = -0.5 才是负数。结果区里会把这个等价写法写出来,避免把「指数带负号」误读成「结果是负数」。

这里的结果和 Excel、Python 算出来的会一样吗?

绝大多数情况下逐位相同,因为三者都遵循 IEEE 754 双精度。可能不同的地方有三处:一是负底数配分数指数,Python 的 (-8) ** (1/3) 同样给复数或报错,不会给 -2;二是开方的专用函数(cbrt、sqrt)与通用 pow 可能差最后一位;三是显示格式,Excel 会按单元格格式显示位数,本页给的是最短往返表示。要比较请统一按 17 位有效数字看。

相关工具