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

问题描述 投票:0回答:1

在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

c floating-point nan webassembly
1个回答
3
投票

在C中,strtof(“nan(0x200000)”,nullptr)表示为0x7fe00000

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

值0x7fa00000和0x7fe00000之间的差异是前者是信号NaN,而后者是安静的NaN。看起来你的C实现选择将NaN表示为安静的NaN,因此有效值的最重要位被设置,而给定的有效负载用于剩余的位。

WebAssembly允许您指定所有有效位,包括最重要的位。您可以使用至少canonN的常量值创建“算术NaN”(其最高有效位设置为安静的NaN),对于32位浮点,该值为0x400000。因此,您可以通过指定0x600000的有效负载来创建0x7fe00000的表示。

© www.soinside.com 2019 - 2024. All rights reserved.