2013-06-30 5 views
3

float, double 또는 long double이 IEEE-754 형식을 완벽하게 준수하는지 확인하는 함수를 작성하고 싶습니다. 내 말은 :부동 소수점 유형이 IEEE-754를 완전히 준수하는지 여부를 반환하는 함수?

내가 std::numeric_limits<T>::is_iec559 그에 해당하는 것을 생각했지만, 내 리눅스 (64)에 long double에 대한 true을 반환 비트는 sizeof(long double) = 16 bytes이지만 내부적으로는 Intel 형식 인 80-bit으로 인코딩됩니다. 그렇게하는 법?

+3

인텔 ® 형식 80 비트 **는 ** IEEE-754 규격 형식입니다 (특히 3.7 절에서 정의 된 "binary64 확장"형식의 요구 사항을 충족 함). 나는 형식이 IEEE-754 "기본 형식"(또는 아마도 "교환 형식")인지 여부를 지정하는 술어를 원한다고 생각합니다. 그것은 is_iec559가 가리키는 것보다 훨씬 더 구체적인 요구 사항이다. –

+0

나는'sizeof (long double)'을 메모리 정렬 요구 사항 때문에 x86_32에서 12 바이트로, x86_64 GNU G ++에서 16 바이트로 정기적으로 봅니다. –

답변

1

std::numeric_limits<T>::is_iec559이 참이면 T이 표준을 준수합니다.

시스템이 내부 레지스터에 80 비트를 사용하는 경우, 최종 반올림 결과가 무한 수의 비트가 사용되는 참조 결과에 가장 가까운 한 괜찮습니다. 즉, 하나의 ulp를 추가하거나 제거하면 참조에서 벗어날 수 있습니다.

모든 가능한 숫자로 가능한 모든 연산을 실행하고 많은 비트를 사용하는 참조와 비교하여 확인하는 것은 어렵습니다.

std::numeric_limits과이를 구현하는 라이브러리에 대한 확신이 있어야합니다.