Skip to content

decimal_gda 设计

decimal_gda 是 0.7.1 的独立 General Decimal Arithmetic 1.70 引擎,以固定 testcase suite 2.62 验证。它不依赖 IEEE-oriented decimal;value、coefficient、 context、flags、interchange 与 finalization 均由本包拥有。

设计目标

GDA 操作不仅产生数值,还会产生 conditions、更新 sticky status,并可能按 trap 转移控制,同时保留 defined result。因此操作被建模为纯状态转换:operand/context → exact operation + finalization → value/raised/next context → fixed-precedence trap → CompletedTrapped。Trap 不是抹掉 value 的 exception,status 也不是 ambient state。

值与 Coefficient 表示

有限 Decimal 保存 classification、sign、package-owned GdaCoeff、exponent、 precision、sNaN state 与 payload。Small(UInt64) 覆盖 10^18-1 以内, Limbs(Array[UInt], digits) 使用 little-endian base-10^9。公开值不共享可变 scratch。

表示保留 cohort、signed zero、qNaN/sNaN 与 payload,以支持 copy、class、total-order、 same-quantum、formatting 与 interchange;不能只保留数学相等关系。

Context、Status 与 Trap 对齐

GdaContext 直接保存 precision、八种 rounding、exponent bounds、clamp、extended、 sticky status 与 trap set。每次操作产生 raised,合并到 next context,再按固定 GDA precedence 选出至多一个 trap。CompletedTrapped 都保留 defined value、next context 与 raised flags。显式 threading 保证 deterministic precedence、无 thread-local 状态,并允许无损恢复。

算术与 Finalization

有限算术先形成精确 signed coefficient 与 preferred exponent,再由共享 GDA finalizer 决定 rounding、cohort、clamp、subnormal、underflow、overflow、signed zero 与 flags。 FMA 保留 exact product 到 addition 后一次舍入。Coefficient kernel 不直接设置 GDA flags。

1–18 digit 的 parse/add/sub/mul/FMA 有 proved wrapper fast path,但仅在 finite、Small、 precision/exponent 内、无需 clamp 且 flag-free 时启用;任一 predicate 失败都回到通用 finalizer。White-box differential test 比较 value、flags、sticky context、trap 与 fallback。

Coefficient 算法选择

本地引擎包含 schoolbook/Comba、Karatsuba、Toom-3、dual-modulus NTT、Knuth D、 Burnikel-Ziegler 与 reciprocal Newton,并同时考虑 size、density、balance、square、 transform length 与 target。

TargetKaratsuba mul/squareToom-3首个 NTT mul/squareBZNewton
native96 / 481,1521,728 / 6402,816 起分段disabled
LLVM96 / 962,0484,096 / 2,0482,0484,096
Wasm / Wasm-GC / JS96 / 964,0968,192 / 4,0962,0484,096

Native NTT/BZ boundary 随 transform/block 增长至 8,192/10,240。NTT bounds、CRT、 Toom exact division 与 quotient/remainder identity 均被检查,失败使用精确 fallback。 阈值数值虽与 IEEE decimal 当前相同,两套代码与测试仍独立,避免未来 IEEE 改动泄漏。

认证初等函数

Sqrt 使用本地 integer-sqrt;integer power 用 exact/bounded exponentiation。Non-integer power、exp/ln/log10 使用 directed binary interval 认证最终 decimal rounding cell。 低成本初始精度只用于普通 bounded operand,inconclusive 时回到保守 refinement; ln(10) 使用不可变单项 cache。任何 approximate candidate 都必须经过 GDA finalization。

GDA mathematical-function 边界只暴露 sqrt、power、exp、ln、log10。Trigonometric、 hyperbolic、inverse、atan2、hypot 与 pi-scaled 不属于该 GDA adapter。

非算术与 Interchange 操作

包实现固定语料使用的 legal scalar inventory:comparison/total order、extrema、logB、 same-quantum、adjacent、copy/class/predicate、logical digits、shift/rotate、integral conversion、scientific/engineering formatting。Concrete decimal32/64/128 interchange 由本包以 DPD 实现;BID 属于 IEEE package,故有意缺席。

优化与切换边界

候选优化首先必须在 value、cohort、raised、next status、trap 上完全一致,其次才需要 target benchmark 收益。Boundary test 覆盖阈值前/点/后以及 sparse、square、unbalanced。 Small fast path 是 semantic predicate;large kernel selector 是 performance policy,二者 不能混淆。

Effect 与验证边界

.decTest parsing、directive snapshot、sharding、JSON、filesystem 与 process status 位于 frontend/CLI/Python tooling;本包是 deterministic value/context transformation。 0.7.1 验收组合 package/property tests、all-target、dependency scan、IEEE isolation 与 两套固定语料:official 64,986/64,986 legal rows,official0 16,124/16,124;141 条 # placeholder/non-scalar 为分母外 diagnostic。

0.7.1 语义保持证明

GDA 系数余数路径计算的仍是相同的欧几里得余数 r = a - floor(a / d) * d,并满足 0 <= r < d。 因此 GCD、exact division 和 half-power comparison 看到的规范化系数事实不变。半幂谓词通过最高位十进制 数字和剩余非零 limb 与 5 * 10^(digits - 1) 比较,绝不把系数转换成二进制近似。

小值算术路径只有在有限结果适合 Small、context 边界且满足无 flag 条件时才进入;随后仍使用同一 GDA finalizer 和 trap precedence。语义验收元组是 value/cohort、raised flags、next sticky context、defined result 和 selected trap。包测试、前端测试、边界 differential test 及两套 decTest 语料覆盖声明面;系数阈值仍是性能策略, 不是 GDA 规则。

证据映射

  • API 列出 GDA value/context/outcome 面。
  • Tutorial 演示 context threading、trap 与恢复。
  • Conformance 定义固定语料与隔离检查。
  • decimal Design 说明独立 IEEE 模型。