For AI agents: the complete documentation index is available at /tc39-atlas/llms.txt, the full documentation bundle is available at /tc39-atlas/llms-full.txt, and this page is available as Markdown at /tc39-atlas/proposals/stage/1/proposal-bigint-math.md.
  • 简体中文
  • BigInt Math S1

    中文标题:BigInt 数学

    提案概览
    提案速览

    该提案旨在补充 JavaScript 中仅支持浮点 Number 的 Math 对象,解决整数数学运算缺失的问题,添加 BigInt 数学函数。它提议在 BigInt 命名空间上增加七个静态函数,如 BigInt.abs 和 BigInt.sqrt,这些函数仅接受 BigInt 并返回 BigInt,其中 sqrt 和 cbrt 会进行截断。

    Note

    以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。

    JavaScript 的 BigInt Math

    ECMAScript Stage 1 提案
    J. S. Choi,2021–2025

    • 规范
    • Babel 插件:尚无

    描述

    (可获取正式草案规范。)

    BigInt 对于众多数学、金融、科学和计时应用(例如 Node.js process.hrtime.bigint API)至关重要,因此自 ES 2021 标准化以来,它们一直是 JavaScript 的宝贵补充。

    几个内置的 Math 函数对 BigInt 是有意义的,但 JavaScript 目前仍不支持它们。它们仅支持常规的浮点 JavaScript Number。

    • 本提案将以下函数添加到作为命名空间的 BigInt 对象中:
      • BigInt.abs
      • BigInt.sign
      • BigInt.sqrt*
      • BigInt.cbrt*
      • BigInt.pow
      • BigInt.min
      • BigInt.max
    • 所有这些函数都返回 BigInt。
    • 这些函数都不接受除 BigInt 以外的任何参数。
      • sqrtcbrt 将结果朝 0 截断为 BigInt。
    • minmax 至少需要一个参数。

    理念

    本提案在性能与先例之间取得平衡。

    1. 单态函数比多态函数更容易让引擎优化。
    2. BigInt 和 Number 在语义上不可互换。开发人员应意识到何时使用 BigInt 与 Number 以避免错误。
    3. 从人体工程学角度看,BigInt 数学函数的 API 应尽可能与 Math 中现有数字函数保持一致。
    4. Number 和 BigInt 是原始类型,因此数学函数应采用静态函数形式,如 BigInt.abs(v),而不是原型方法如 v.abs()
      • 这与 BigInt.asIntNBigInt.asUintN 的先例一致。
      • 这与提议的 Decimal128s 不同。Decimal128 将是对象,因此应使用原型方法。

    愿景

    本初步提案仅添加了少数几个 BigInt 方法。愿景是本提案将为新的 BigInt 数学函数提案开辟道路,例如:

    • BigInt.gcd(v):最大公约数(GCD)
    • BigInt.popCount(v):种群计数
    • BigInt.bitLength(v):位长度,即截断的 log2
    • BigInt.modPow(v, exponent, modulus):模幂运算
    • BigInt.modInverse(v, modulus):模乘法逆元
    • BigInt.fromString(value, radix):基数 n 字符串解析
    • BigInt.toByteArray(v, endian):转换为字节数组
    • BigInt.fromByteArray(bytes, endian):从字节数组转换

    其中一些可能也适用于普通整数 Number。

    排除的 Math

    对 BigInt 没有意义的 Math 函数不包括在本提案中。这些包括:

    Math 方法排除原因
    acos超越的:当数值大时难以计算
    acosh超越的
    asin超越的
    asinh超越的
    atan超越的
    atan2超越的
    atanh超越的
    ceil没有已知用例;Math.ceil(3n / 2n) == 1 可能令人惊讶
    clz32没有已知用例
    cos超越的
    cosh超越的
    exp超越的
    expm1超越的
    floor没有已知用例
    fround按定义返回浮点数
    hypot没有已知用例
    imul没有已知用例
    log超越的
    log10截断可能令人惊讶;没有已知用例
    log2截断可能令人惊讶;推迟到未来的 bitLength 提案
    log1p超越的
    random没有概念上的纯整数模拟
    round没有已知用例;Math.round(3n / 2n) == 1 可能令人惊讶
    sin超越的
    sinh没有已知用例
    tan超越的
    tanh超越的
    trunc没有已知用例