2017-12-24 74 views
0

C에서는 strtof("nan(0x200000)", nullptr)0x7fe00000으로 표시됩니다. 그러나 WebAssembly spec interpreter tests에서 :WebAssembly : (f32.const nan : 0x200000)은 0x7fa00000 또는 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)) 

그래서 (또는 nan:0x200000) WebAssembly nan(0x200000)0x7fa00000로 표현해야하거나 오류입니까?

왜 C에서 다르게 구현 되나요?

같은 질문은 f64.const입니다. C에서

+1

C 표준은 부동 소수점 형식을 요구하지 않으므로 NaN이 무엇인지 지정하지 않습니다. –

답변

3

, strtof는 ("유모 (0x200000)"nullptr) 이것은 반드시 그렇지 않다 0x7fe00000

로 표현. C에서 NaN에 대한 추가 정보의 동작은 구현에 따라 정의됩니다.

값 0x7fa00000과 0x7fe00000의 차이는 전자는 신호 NaN이고 후자는 조용한 NaN입니다. C 구현은 NaN을 조용한 NaN으로 표현하도록 선택 했으므로 significand의 최상위 비트가 설정되고 주어진 페이로드는 나머지 비트에 사용됩니다.

WebAssembly을 사용하면 최상위 비트를 포함하여 모든 유효 비트를 지정할 수 있습니다. 32 비트 부동 소수점의 경우 0x400000 인 최소 캐논의 값이 N 인 상수 값을 사용하여 "산술 NaN"(조용한 NaN처럼 가장 중요한 비트가 설정되어 있음)을 만들 수 있습니다. 따라서 0x600000의 페이로드를 지정하여 0x7fe00000의 표현을 만들 수 있습니다.