对数计算器

输入一个正数与底数,一次算出自然对数、常用对数、二进制对数与任意底数结果,并反算 b 的 y 次方校验,同时给出换底公式的每一步中间量。

提示:在任一输入框里按 Enter 立即重算;下拉框或底数改动也会自动重算。

xln x(Math.log)lg x(Math.log10)log2 x(Math.log2)

使用方法

  1. 在「数值 x」里填一个大于 0 的十进制数,页面默认填好示例 1000;「底数」下拉默认选中常用对数(底 10),也可以切到自然对数 e、二进制对数 2,或选「自定义底数」后在旁边的输入框里填任意大于 0 且不等于 1 的底数。
  2. 点「计算」,结果区给出主结果 log 底 b 的 x,下面依次是计算路径(内置函数还是换底)、自然对数 ln x、常用对数 lg x、二进制对数 log2 x、换底中间量 ln x、换底中间量 ln b、换底结果 ln x ÷ ln b(与主结果对比),以及反算校验 b 的 y 次方。底数恰好是 e、10、2 时主结果走内置函数,对比行则显示换底结果,两者通常只差最后一位。
  3. 在任一输入框里按 Enter 立即重算;改动下拉框或自定义底数也会自动重算,不需要再点按钮。
  4. 下方对照表列出 24 个常用数值的 ln、lg、log2,默认显示 12 行,点「加载更多」每次再放 12 行。点「复制对照表」得到制表符分隔的文本,点「导出对照表 CSV」下载带 UTF-8 BOM 的表格文件。
  5. 点「载入示例」把数值与底数恢复成 1000 与 10,并重新算一遍。

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

一是把三种常用对数一次算齐。物理题里常要 ln,工程估算题里常要 lg,算法复杂度题里常要 log2;本页一次把这三个结果并列出来,省掉了在中途换算底数的步骤,也避免了「换错底」这类低级错误。

二是算出任意底数的对数值。计算机与计算器通常只提供自然对数和常用对数两把钥匙,需要 log 底 3、log 底 7 这类结果时,必须用换底公式绕一步;本页把这一步做成输入框,直接给结果并显示中间量。

三是核对教材、试卷或程序里的对数结果。做实验数据处理时,理论值与人手算的值差一点点很常见,本页同时给出换底中间量和反算值,可以判断差异来自四舍五入、底数取错,还是真的算错了。

四是排查换底公式写反的代码。把 Math.log(x) / Math.log(b) 写成 Math.log(b) / Math.log(x) 是最常见的一种错,两者的结果互为倒数、在 b 与 x 接近时数值差别不大,肉眼很难发现;本页可以拿一组具体数值快速对照。

本页不做这些事:不做幂运算与开方的专门计算(那是反方向的工具)、不做对数坐标图的绘制、不做复数对数(需要实部加虚部的表示法,本页只在说明里解释为什么它超出实数范围)。

原理和变量:Math.log、Math.log10 与换底公式

这个对数计算器的计算内核是 ECMAScript 标准里的三个数学函数:Math.log(x) 返回自然对数(底为 e ≈ 2.718281828459045),Math.log10(x) 返回常用对数(底为 10),Math.log2(x) 返回二进制对数(底为 2)。三者都接受一个 Number 参数、返回 Number。

最容易踩的坑是名字。很多语言的 log() 是常用对数,而 JavaScript 的 Math.log() 是自然对数;把 Math.log(1000) 当成 lg 会得到 6.907755278982137,而正确答案 3 差了一倍多。Math.LN10 是常量 2.302585092994046、Math.LN2 是 0.6931471805599453、Math.LOG10E 是 0.4342944819032518、Math.LOG2E 是 1.4426950408889634,换底时常直接引用。

任意底数走换底公式。数学上 log 底 b 的 x 等于 ln x ÷ ln b,翻译成代码就是 Math.log(x) / Math.log(b)。中间量一共两个:分子 Math.log(x) 与分母 Math.log(b),本页把这两个值都显示出来,方便核对。也可以换成 Math.log10(x) / Math.log10(b) 或 Math.log2(x) / Math.log2(b),数学上等价,浮点结果可能差最后一位。

为什么内置 log10 往往比换底更准。换底要算两次对数再相除,两次的舍入误差会叠加;内置 Math.log10 是一次逼近,通常更接近真值。实测 x = 1000、底 10 时,Math.log10(1000) 精确返回 3,而 Math.log(1000) / Math.LN10 得到 2.9999999999999996,两者相差 4.440892098500626e-16。所以能用内置函数就用内置函数,需要非 2、非 10、非 e 的底数时再换底。

反算校验是最后一道闸。把结果 y 代回去算 Math.pow(b, y),正常情况下应该回到 x 附近(例如 10 的 3 次方等于 1000);差得远说明底数或数值填错了。ECMAScript 还规定 Math.log10 属于「实现近似」函数,即各引擎的最后一个二进制位允许有差异,跨平台比对时不要卡到小数点后 15 位。

完整示例:x = 1000、底数 10

示例条件就是页面打开时的默认状态:数值 1000、底数 10。此时主结果 log 底 10 的 1000 等于 3,也就是 10³ = 1000 的逆运算。因为底数正好是 10,本页走的是内置 Math.log10 这条一次逼近路径(结果区第一行会标明),所以主结果精确是 3。下面把每一步的中间量列出来,可以和结果区逐项对照:

把同一个 1000 换成其它底数:底 2 时 log2(1000) = 9.965784284662087,底 e 时就是自然对数 6.907755278982137;换成底 3 则用换底算得 6.2877098228681545,反算 3 的 6.2877098228681545 次方得到 1000.0000000000008,与 1000 只差 8e-13。数值仅作演示,它们只由 x 与底数决定,与显示格式无关。

输入范围与常用数值对数对照表

数值 x 的可用范围是大于 0 且不超过 1.7976931348623157e308(双精度能表示的最大值),负数和 0 都会被拦下并给出具体提示。底数 b 的范围是大于 0 且不等于 1,可以取 0.5 这样的小数。下表列出十个代表性数值的三个对数值,取六位小数。

xln xlg xlog2 x
0.1−2.302585−1−3.321928
0.5−0.693147−0.301030−1
1000
20.6931470.3010301
2.71828182810.4342941.442695
102.30258513.321928
1004.60517026.643856
10006.90775539.965784
100009.210340413.287712
100000013.815511619.931569

从表里能看出两个恒定规律:无论 x 取多少,lg x 与 ln x 的比值恒等于 log10(e) ≈ 0.4342944819032518(也就是 Math.LOG10E),log2 x 与 ln x 的比值恒等于 log2(e) = 1.4426950408889634(也就是 Math.LOG2E)。上方的动态对照表把数值扩展到 24 个,包含 1e12、1e100 与双精度的两个极端值。

边界与精度:定义域、负底数与 Math.log1p

常见问题

ln、lg、log 到底哪个是哪个?

ln 是自然对数,底为 e ≈ 2.718281828459045;lg 是常用对数,底为 10;在算法与信息论里 log 常指底 2。JavaScript 里对应的三个函数是 Math.log(自然对数)、Math.log10、Math.log2。注意 Math.log 是自然对数,不是常用对数,这是最容易记反的一处。

为什么换底算 log10(1000) 得到 2.9999999999999996,而不是 3?

换底要先算 ln 1000 与 ln 10 两次逼近再相除,两次舍入误差叠加,最后一位偏了 4.440892098500626e-16。内置的 Math.log10(1000) 是一次逼近,精确返回 3。需要底 10 时直接用 Math.log10 即可,换底留给非 2、非 10、非 e 的底数。

为什么输入 0 或负数会被拦下?

因为实数范围内的对数只在 x > 0 时有定义。Math.log(0) 返回 −Infinity,Math.log(−1) 返回 NaN,都不是可以继续参与计算的数;负数真正的对数落在复数域(ln(−1) = iπ),需要两个分量表示,本页不处理。

底数填 1 或者负数可以吗?

不行。换底公式的分母 ln b 在 b = 1 时等于 0,除法无意义;b 为负数时 ln b 在实数范围无定义。底数必须大于 0 且不等于 1,像 0.5、2、7、100 都可以。

Math.log1p 是干什么用的?

它直接算 ln(1 + x),避免先做 1 + x 时把极小的 x 舍掉。x = 1e-16 时 Math.log(1 + x) 返回 0,而 Math.log1p(1e-16) 返回 1e-16。凡是计算「微小变化率」「复利中的小利率对数」这类场景,都应该用 Math.log1p。

输入很大的数结果还对吗?

对。只要不超过 1.7976931348623157e308,双精度都能装下,对应的自然对数最大约 709.78、以 2 为底最大 1024,远没有溢出风险。超过上限的输入会被 Number 变成 Infinity,本页会提示超出双精度范围。

「复制对照表」和「导出对照表 CSV」有什么区别?

前者把对照表以制表符分隔的文本写进剪贴板,粘进 Excel 会自动分列;后者下载一个开头带 UTF-8 BOM 的 .csv 文件,双击用 Excel 打开不会中文乱码。两者内容一致。

输入的数值会传到服务器吗?

不会。这个对数计算器的全部运算都在当前页面的脚本里完成,用的是浏览器内置的 Math 函数,全程没有网络请求,也不写浏览器存储。打开开发者工具的 Network 面板边算边看,不会有新请求发出。

相关工具