WebAssembly:(f32.const nan:0x200000) 表示 0x7fa00000 或 0x7fe00000

WebAssembly: (f32.const nan:0x200000) means 0x7fa00000 or 0x7fe00000

在C中,strtof("nan(0x200000)", nullptr)表示为0x7fe00000。但是在 WebAssembly spec interpreter tests:

(assert_return (invoke "f32.reinterpret_i32" (i32.const 0x7fa00000)) (f32.const nan:0x200000))
(assert_return (invoke "f32.reinterpret_i32" (i32.const 0xffa00000)) (f32.const -nan:0x200000))

所以,在 WebAssembly 中 nan(0x200000)(或 nan:0x200000)应该表示为 0x7fa00000,否则它是一个错误?

为什么在 C 中实现不同?

f64.const同样的问题。

In C, strtof("nan(0x200000)", nullptr) represented as 0x7fe00000

不一定如此。 C 中 NaN 的额外信息的行为是实现定义的。

值0x7fa00000和0x7fe00000的区别在于前者是一个信号NaN,而后者是一个静默NaN。看起来您的 C 实现选择将 NaN 表示为安静的 NaN,因此设置了有效数字的最高有效位,而给定的有效负载用于其余位。

WebAssembly 允许您指定所有有效位,包括最高有效位。您可以使用至少为 canonN 的常数值创建一个 "arithmetic NaN"(其最高有效位设置为安静的 NaN),对于 32- 为 0x400000位浮点数。因此,您可以通过指定 0x600000 的有效负载来创建 0x7fe00000 的表示。