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 的表示。
在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 的表示。