컴파일러는 정의되지 않은 동작 (예 : 덧셈이 오버플로가 아닌 것으로 가정)을 유도하는 몇 가지 가정을 할 수 있습니다. 부동 소수점 NaN과 관련하여 그러한 가정을 할 수 있을까요?최적화 프로그램이 부동 소수점이 NaN이 아니라고 가정 할 수 있습니까?
double a = some_calc();
double b = a;
if(a == b)
do_something();
는 최적화 프로그램이 조건문을 제거하고 항상 참이되어 있다고 가정 할 수 있습니다 : 예를 들어
? 또는 플랫폼 부동 소수점 규칙 (IEEE)에 바인딩되어 있으며 값이 NaN 인 경우에 체크해야합니다.
즉, 컴파일러는 double에 NaN이 없다는 가정하에 최적화 할 수 있습니까? C++ 표준은 부동 소수점이 실제로 플랫폼에서 어떻게 작동하는지에 관해 많이 말하지 않기 때문에 이것이 실제로 완전히 지정되었는지 명확하지 않습니다. 구현은 IEEE 754 부동 소수점 숫자를 사용하는 경우
구현이 NaN을 지원하는 것으로 문서화하는 경우 NaN을 지원해야합니다. 옵티 마이저는 구현의 일부입니다. 그게 충분한 정보입니까? ;-) –
즉, 위의 최적화를 허용하도록 구현에서 NaN을 정의 할 수 있습니까? 표준에는 isnan 함수가 있기 때문에 기능이 손실되지는 않습니다. –
C++ 표준에'NaN! = NaN'이 필요하다고 생각하지 않습니다. 여기서'NaN'은 조용한 NaN입니다. 내가 옳다면, C++ 구현은 'NaN == NaN'과 같은 자체의 not-a-numbers를 정의 할 수 있고 최적화가 유효합니다. 이 구현은 * IEEE * NaN을 지원하지 않습니다. 내가 틀렸고 C++에서 'NaN! = NaN'을 요구한다면 옵티마이 저는'operator == (double, double)'을'operator == (int, int)'를 다루는 방식으로 처리 할 수 없습니다. . –