同一个 Rust 给出两个不同答案,而且都不匹配 JavaScript
来源:dev.to — 2026-08-18
📋 概述
作者把 15 年历史的 JS 色彩库 TinyColor 移植到 Rust,规则是让原测试套件一字不改地通过(连文件都 sha256 固定)。44/45 一次性通过,第 45 个是 WCAG 对比度 readability 在最后一位小数差了一个 f64 最小单位:1.1121078324840545 vs 1.1121078324840543。这个「1 ULP」的差异引出一个关于浮点与移植的精彩故事。
🔑 核心要点
- 移植规则极其严格:原测试文件字节级 sha256 固定、加载 Rust 编译的 WASM。
- 第 45 个用例暴露两个 f64 只在最后一位不同——这是双精度之间最小的分歧。
- 大多数测试套件用 epsilon 比较浮点,TinyColor 却断言到小数点后 16 位,正是它抓住了差异。
- readability 基于相对亮度与线性化公式,最后一位的取舍在 JavaScript 与 Rust 间并不总一致。
💡 金句
最后一位的差异,是最小的 f64 分歧——也是移植中最难察觉的那种坑。
👍 0
👎 0
← 返回 dev.to 首页