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

标签 c floating-point nan webassembly

在 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 的常量值(对于 32 位 float 为 0x400000)来创建“算术 NaN”(其最高有效位设置为安静的 NaN)。因此,您可以通过指定 0x600000 的有效负载来创建 0x7fe00000 的表示。

关于c - WebAssembly:(f32.const nan:0x200000) 表示 0x7fa00000 或 0x7fe00000,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47961537/

相关文章:

python - 下面的二次方程代码有什么问题?

c++ - C/C++ - 查询依赖于平台的换行符(用于内存映射文件)

c - 如何读取和写入用户信息到具有结构的文件

c++ - 十进制转二进制输出

c - 用 C 写一个基本的 traceroute 脚本

javascript - 为什么 JS 在 : ` + ' any_string'` 中返回 NaN

Java 相当于 Matlab 的 `eps` 或 Numpy/Python 的 `spacing` 函数(浮点相对精度)

python - 我如何强制 Python 将整数保留在科学记数法之外

python - Pandas 缺失值 : fill with the closest non NaN value

python - 基于现有列值的新列