2012-02-21 7 views
2

컴파일러는 정의되지 않은 동작 (예 : 덧셈이 오버플로가 아닌 것으로 가정)을 유도하는 몇 가지 가정을 할 수 있습니다. 부동 소수점 NaN과 관련하여 그러한 가정을 할 수 있을까요?최적화 프로그램이 부동 소수점이 NaN이 아니라고 가정 할 수 있습니까?

double a = some_calc(); 
double b = a; 
if(a == b) 
    do_something(); 

는 최적화 프로그램이 조건문을 제거하고 항상 참이되어 있다고 가정 할 수 있습니다 : 예를 들어

? 또는 플랫폼 부동 소수점 규칙 (IEEE)에 바인딩되어 있으며 값이 NaN 인 경우에 체크해야합니다.

즉, 컴파일러는 double에 NaN이 없다는 가정하에 최적화 할 수 있습니까? C++ 표준은 부동 소수점이 실제로 플랫폼에서 어떻게 작동하는지에 관해 많이 말하지 않기 때문에 이것이 실제로 완전히 지정되었는지 명확하지 않습니다. 구현은 IEEE 754 부동 소수점 숫자를 사용하는 경우

+0

구현이 NaN을 지원하는 것으로 문서화하는 경우 NaN을 지원해야합니다. 옵티 마이저는 구현의 일부입니다. 그게 충분한 정보입니까? ;-) –

+0

즉, 위의 최적화를 허용하도록 구현에서 NaN을 정의 할 수 있습니까? 표준에는 isnan 함수가 있기 때문에 기능이 손실되지는 않습니다. –

+0

C++ 표준에'NaN! = NaN'이 필요하다고 생각하지 않습니다. 여기서'NaN'은 조용한 NaN입니다. 내가 옳다면, C++ 구현은 'NaN == NaN'과 같은 자체의 not-a-numbers를 정의 할 수 있고 최적화가 유효합니다. 이 구현은 * IEEE * NaN을 지원하지 않습니다. 내가 틀렸고 C++에서 'NaN! = NaN'을 요구한다면 옵티마이 저는'operator == (double, double)'을'operator == (int, int)'를 다루는 방식으로 처리 할 수 ​​없습니다. . –

답변

2

또는는이 std::numeric_limits<double>::is_iec559 true로 설정되고, 반드시 그렇지는 플랫폼 부동 소수점 규칙 (IEEE)

에 바인딩됩니다.

그리고 값이 NaN 인 경우 강제로 확인합니까? 구현 은 IEEE 754를 사용하는 경우

는 산술 연산의 결과는 IEEE 부동 소수점 규칙과 일치해야하지만, 지금까지 비교가가는대로, 그것은 최적화 할 수 있습니다. some_calc의 본문이 동일한 번역 단위 (또는 링크 타임 코드 생성 중)의 컴파일러에서 분석 할 수있는 경우 은 결코 NaN (즉 상수를 반환 함)을 반환 할 수 없다고 결론을 내릴 수 있습니다. 코드의 의미가 바뀌지 않으므로

+0

그래서 컴파일러가'some_calc'가 NaN을 반환 할 수 있는지 여부를 결정할 수 있는지 여부가 결정됩니다. 그것이 100 % 확실성으로 알 수 없다면 비교를해야 할 것입니다 (또는 그것이 더 빨라지는지 확인하십시오). –

+0

@ edA-qamort-ora-y 예. 모든 최적화에서 마찬가지입니다. 함수의 본문이 컴파일러에 불투명 한 경우 아무 것도 가정 할 수 없습니다 (이 함수는 값을 반환 할 수 있고 부작용이있을 수 있습니다). –

+2

그러나 일부 컴파일러에는 최적화 플래그가있어서 사용자가 " NaN에 신경 쓰지 마라. " 그런 플래그를 사용하면 컴파일러는 여기서 NaN의 가능성을 무시합니다. –