2014-12-05 2 views
3

내 프로그램에서 대기 시간 요구 사항이 발생하여 -Ofast gcc 옵션을 사용하고 있습니다. 나는 기본 플래그와 -Ofast 그것을 실행하려고했습니다gcc - 전체 제한 목록

#include <iostream> 
#include <math.h> 

static double quiet_NaN = std::numeric_limits<double>::quiet_NaN(); 

int main() 
{ 
    double newValue = 130000; 
    double curValue = quiet_NaN; 
    printf("newValue = %f\n", newValue); 
    printf("curValue = %f\n", curValue); 
    printf("isnan(newValue) = %d\n", isnan(newValue)); 
    printf("isnan(curValue) = %d\n", isnan(curValue)); 
    printf("newValue == curValue %d\n", (newValue == curValue)); 
    printf("newValue != curValue %d\n", (newValue != curValue)); 
} 

:

$ g++ TestPointer.cpp 
$./a.out 
newValue = 130000.000000 
curValue = nan 
isnan(newValue) = 0 
isnan(curValue) = 1 
newValue == curValue 0 
newValue != curValue 1 

$ g++ -Ofast TestPointer.cpp 
$ ./a.out 
newValue = 130000.000000 
curValue = nan 
isnan(newValue) = 0 
isnan(curValue) = 1 
newValue == curValue 1 
newValue != curValue 0 

그래서 !===의 결과가 신뢰할 수없는 나는 간단한 테스트 프로그램을 썼습니다. 그것은 두 값이 난이 아닌 것으로 알려진 경우에만 ==!=을 사용해야한다는 것을 의미합니까? 그렇지 않으면 전에 isnan으로 테스트해야합니까?

-Ofast으로 isnan이 올바르게 작동하는지 확인합니까? -Ofast을 사용하면 ==!=이 올바르게 작동합니까? 누군가가 -Ofast에 의해 추가 된 전체 제한 목록을 제공 할 수 있습니까?

+0

왜 처음에는 -Ofast를 사용하고 있습니까? 그 의사를 읽었 니? 그것은 -O3 -Fast-Math와 동일합니다. -Fast-Math는 float/double이 빠르면 잘못된 결과를 줄지도 모른다는 것을 의미합니다. –

답변

7

-ffast-math의 효과를 관찰하고 있습니다. docs에서

:

-Ofast

무시 엄격한 기준 준수. -Ofast는 모든 -O3 최적화를 가능하게합니다. 또한 은 모든 표준 호환 프로그램에 유효하지 않은 최적화를 가능하게합니다. -phast-math와 포트란 특정 -fno-protect-parens 및 -fstack-arrays를 켭니다.

-ffast - 수학

설정 -fno-수학 errno를, -funsafe - 수학 - 최적화, -fno-트래핑 - 수학, -ffinite - 수학 전용 , -fno-rounding-math, -fno-signaling-nans 및 fcx-limited-range가 있습니다. 인수 및 결과는 NaN을 또는 + -Infs없는 가정 부동 소수점 연산에 대한

-ffinite - 수학 전용

허용 최적화.

잘못된 것으로 표시된 여러 gcc 버그 보고서가 있습니다.

Problems with -ffast-math and isnan

또한, 엄격한 IEEE 부동 점의 비교는 항상 false가 발생합니다.

Checking if a double (or float) is NaN in C++

이 반드시 -ffast-math 적용되지 않습니다 그러나 당신이 보여 무엇을 설명합니다.

gcc는 -ffast-math 수레가 어떻게 작동하는지에 대한 공식적인 표준을 설명하지 않으므로 gcc의 버전간에 일관성을 유지해야한다고 가정 할 때 경험적으로 세부 사항을 연구해야합니다. 더 나아가서는 NaN-ffast-math의 결합을 완전히 피하십시오.

+0

isnan과'-Ofast '? 작동할까요? 아니면 보증되지 않으며 때로는 사실이 될 수 있으며 때로는 거짓이 될 수 있습니까? – javapowered

+0

당신은 NaN과'-ffast-math'의 조합을 완전히 피해야 만합니다.하지만'isnan'은 명시 적으로 설정된 NaN에 대해 예상대로 동작 할 것입니다. 비록 그것이하더라도, 항상 그것을 의지하지 않는다. – Praxeolitic

+0

'-fast-math'를 제외하고'-Ofast'를 어떻게 설정할 수 있습니까? – javapowered