2017-12-24 42 views
0

In C, strtof("nan(0x200000)", nullptr) dargestellt als 0x7fe00000. Aber in WebAssembly spec interpreter tests:WebAssembly: (f32.const nan: 0x200000) bedeutet 0x7fa00000 oder 0x7fe00000

(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)) 

Also, in Webassembly nan(0x200000) (oder nan:0x200000) als 0x7fa00000 dargestellt werden, oder es ist ein Fehler aufgetreten?

Warum in C ist es anders implementiert?

Gleiche Frage für f64.const.

+1

Der C-Standard schreibt kein Gleitkommaformat vor, daher gibt er auch nicht an, was ein NaN sein soll –

Antwort

3

In C, strtof ("nan (0x200000)", nullptr) dargestellt als 0x7fe00000

Das so nicht unbedingt. Das Verhalten der zusätzlichen Information für NaNs in C ist implementationsdefiniert.

Der Unterschied zwischen den Werten 0x7fa00000 und 0x7fe00000 besteht darin, dass ersterer ein signalisierendes NaN ist, während letzteres ein ruhiges NaN ist. Es sieht so aus, als ob Ihre C-Implementierung NaNs als stille NaNs darstellt, so dass das höchstwertige Bit des Signifikanden gesetzt wird, während die gegebene Nutzinformation für die restlichen Bits verwendet wird.

WebAssembly können Sie alle signifikanten Bits einschließlich der höchstwertigen Bits angeben. Sie können ein "arithmetisches NaN" (das das höchstwertige Bit wie ein ruhiges NaN gesetzt hat) erstellen, indem Sie einen konstanten Wert von mindestens N verwenden, der 0x400000 für 32-Bit Fließkommawerte ist. Sie können also eine Darstellung von 0x7fe00000 erstellen, indem Sie eine Nutzlast von 0x600000 angeben.