ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

scriptc数字格式化深度解析:JS精确f64语义与最短往返算法的实现

scriptc数字格式化深度解析:JS精确f64语义与最短往返算法的实现 scriptc数字格式化深度解析JS精确f64语义与最短往返算法的实现【免费下载链接】scriptcTypeScript-to-Native Compiler项目地址: https://gitcode.com/GitHub_Trending/sc/scriptcscriptc 是一个 TypeScript/JavaScript 原生编译器它能把 TS 和 JS 编译成类型化 IR、可读 C、LLVM 文本 IR、汇编、目标文件与原生可执行文件。其中容易被忽略、却决定输出正确性的细节是数字格式化。编译后的原生运行时没有 JavaScript 引擎却必须让String(0.1 0.2)和 Node 一样精确输出0.30000000000000004——这正是 scriptc 数字格式化模块要解决的JS 精确 f64 语义问题。为什么数字转字符串这么难在 JavaScript 里Number.prototype.toString(10)的规范ECMA-262 §6.1.6.1.20要求输出满足一个精妙定义找到最短的数字串 s位数 k、标度 n使得 s 能往返解析回同一个 double在长度相同的所有候选中取最接近原值者平局时取偶数。然后还要按放置规则决定排版指数 n 满足-6 n 21时用定点表示如123.45、0.000001其余情况用科学计数法如1e21V8 用 Grisu、SpiderMonkey 用 Ryū 这类算法实现最短往返数字。scriptc 的选择是Ryū纯整数运算vendored 在运行时的 vendor/ryu/d2s.c不依赖snprintf/strtod试探也没有 locale 干扰。核心实现一行都不靠浮点运算核心代码在 scr_number.c分两层第一层数字生成scr_f64_digitsint scr_f64_digits(double x, char digits[18], int *n_out) { // 1. 直接拆 IEEE-754 位模式尾数 指数 // 2. 小整数快速路径 d2d_small_int()尾数末尾的十进制 0 折进指数 // 3. 其余走完整算法 d2d()纯 64 位整数运算 // 4. 用 div10 逐位取出 k 个十进制数字k ≤ 17 }关键点double 被拆成位模式后交给 Ryū 查表算法整个最短往返判定没有任何浮点乘除只有整数除 10 和查表。这意味着结果在不同平台、不同编译器、不同 locale 下都字节级一致。第二层ECMA 排版scr_f64_to_str拿到数字串后按规范放置四个分支正好对应 JS 的四种形态条件输出形态示例k n 21整数补零1234567890123456800 n 21ddd.ddd3.141592653589793-6 n 00.000ddd0.000001其他d.ddde±e1.7976931348623157e308边界值也各有讲究NaN、Infinity、-0单独短路处理保证-0输出0而Object.is仍能区分符号。字节级验证拿 Node 当裁判 精确不是口号scriptc 用oracle 测试把字节级一致性钉死用例生成器 gen-number-cases.mjs 用 Node 作为 oracle覆盖0.1 0.2、Number.MIN_VALUE5e-324、MAX_SAFE_INTEGER 2、2 的幂及其邻域、科学计数法切换边界1e±7附近等输出为双精度位模式 期望字符串的用例文件 number-cases.txt测试 number.test.ts 编译 C 侧 oracle 程序逐条比对另有100 万随机 double 的 fuzz 门禁fuzz子命令持续防回归集成层还有一个端到端语料测试 100-number-format.ts从0.1 0.2、1/3到5e-324、-0逐行断言编译产物与 Node 输出一致。对使用者的意义对新手而言理解这套机制只需要记住三件事无需 Node 的精确输出——原生可执行文件直接链接 C 运行时数字格式化不再依赖 V8 或任何 JS 引擎跨平台一致性——纯整数算法保证了 macOS / Linux / Windows / WASI 上console.log(x)输出逐字节相同性能友好——小整数走快速路径普通路径是常数级查表 逐位除法没有格式化缓冲区和strtod反查。这套Ryū 数字生成 ECMA 排版 Node oracle 验证的组合是 scriptc 把 JS 语义完整搬到原生运行时的一块典型拼图规范条文变成 C 代码Node 的行为变成不可漂移的测试基线。延伸阅读运行时 C 源码 packages/runtime/src/scr_number.c、Ryū 实现 packages/runtime/vendor/ryu/、测试用例生成 packages/runtime/test/gen-number-cases.mjs。【免费下载链接】scriptcTypeScript-to-Native Compiler项目地址: https://gitcode.com/GitHub_Trending/sc/scriptc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表