/fp(부동 소수점 동작 지정)
소스 코드 파일에서 부동 소수점 동작을 지정합니다.
/fp:[precise | except[-] | fast | strict ]
Flags
precise
이 옵션이 기본값입니다.ANSI를 엄격하게 준수하는 데 필요한 부동 소수점 계산의 정밀도를 변경할 수 있는 최적화를 비활성화하여 같음 및 같지 않음 연산에 대한 부동 소수점 테스트의 일관성이 향상됩니다. 기본적으로 컴파일러는 보조 프로세서의 80비트 레지스터를 사용하여 부동 소수점 계산의 중간 결과를 저장합니다. 따라서 프로그램 속도가 빨라지고 프로그램 크기가 작아집니다. 그러나 이 계산은 메모리에서 80비트 미만으로 표현되는 부동 소수점 데이터 형식을 처리하므로, 긴 계산을 통해 정밀도의 추가된 비트(80비트에서 작은 부동 소수점 형식의 비트 수 빼기)를 수반하는 경우에는 결과가 일치하지 않을 수도 있습니다.
x86 프로세서에 /fp:precise를 사용하면 함수에 매개 변수를 전달할 때 부동 소수점 형식의 변수에 대해 컴파일러가 할당 및 캐스트에 적합한 정밀도로 반올림을 수행합니다. 이렇게 반올림하면 해당 형식의 용량보다 큰 상위값을 갖지 않도록 할 수 있습니다. /fp:precise 를 사용하여 컴파일한 프로그램은 /fp:precise를 사용하지 않고 컴파일한 프로그램보다 속도가 느리고 크기가 더 클 수 있습니다. /fp:precise는 내장 형식을 비활성화하고 표준 런타임 라이브러리 루틴을 대신 사용합니다. 자세한 내용은 /Oi(내장 함수 만들기)를 참조하십시오.
/fp:precise를 사용하면 다음과 같은 부동 소수점 동작이 활성화됩니다.
/fp:precise를 사용하면 여러 연산을 마지막에 한 번만 반올림하는 합성 연산 하나로 대체하는 축약이 활성화됩니다.
특별한 값(NaN, +infinity, -infinity, +0, -0)에 대해 유효하지 않은 식 최적화가 허용되지 않습니다. x-x => 0, x*0 => 0, x-0 => x, x+0 => x 및 0-x => -x 최적화는 모두 여러 가지 이유로 인해 유효하지 않습니다. IEEE 754 및 C99 표준을 참조하십시오.
NaN이 관련된 비교를 컴파일러에서 올바르게 처리할 수 있습니다. 예를 들어, x가 NaN이고 NaN이 관련된 순서 지정 비교에서 예외가 발생하는 경우 x != x는 true입니다.
한 가지 예외를 제외하고는 식 계산이 C99 FLT_EVAL_METHOD=2를 따릅니다. x86 프로세서에 대한 프로그래밍의 경우 FPU가 53비트 정밀도로 설정되므로 이는 long double 정밀도로 간주됩니다.
정확히 1.0을 곱하는 식은 다른 인수를 사용하도록 변환됩니다. x*y*1.0은 x*y로 변환됩니다. 마찬가지로, x*1.0*y도 x*y로 변환됩니다.
정확히 1.0으로 나누는 식은 피제수를 사용하도록 변환됩니다. x*y/1.0은 x*y로 변환됩니다. 마찬가지로, x/1.0*y도 x*y로 변환됩니다.
fenv_access를 ON으로 설정하고 /fp:precise를 사용하면 부동 소수점 식의 컴파일 타임 계산과 같은 일부 최적화가 비활성화됩니다. 예를 들어, _control87, _controlfp, __control87_2를 사용하여 반올림 모드를 변경하면 컴파일러에서 부동 소수점 계산을 수행할 때 사용자가 지정한 반올림 모드가 적용되지 않습니다. 이 반올림 모드를 적용하려면 fenv_access를 ON으로 설정해야 합니다.
/fp:precise는 /Op 컴파일러 옵션을 대체합니다.
fast
대부분의 경우에 가장 빠른 코드를 만듭니다. /fp:fast는 /fp:strict 또는 /fp:precise와 함께 사용할 수 없으며 명령줄에서 지정한 마지막 옵션이 사용됩니다. /fp:fast와 /fp:except를 함께 사용하면 컴파일러 오류가 발생합니다./Za, /Ze(언어 확장 사용 안 함)(ANSI 호환) 및 /fp:fast를 선택하면 예기치 않은 결과가 발생할 수 있습니다. 예를 들어, 단정밀도 부동 소수점 연산이 단정밀도로 반올림되지 않을 수 있습니다.
except[-]
안전한 부동 소수점 예외 모델입니다. 예외는 트리거되는 즉시 발생합니다. 이 옵션은 기본적으로 해제되어 있습니다. 옵션에 - 기호를 추가하여 이 옵션을 명시적으로 비활성화할 수 있습니다.strict
가장 엄격한 부동 소수점 모델입니다. /fp:strict를 사용하면 fp_contract가 OFF로 설정되고 fenv_access가 ON으로 설정됩니다. /fp:except는 암시적이며 /fp:except-를 지정하여 명시적으로 비활성화할 수 있습니다. /fp:except-와 함께 /fp:strict를 사용하면 예외 이벤트를 고려하지 않은 채 엄격한 부동 소수점 의미 체계가 적용됩니다.
설명
여러 /fp 옵션을 동일한 컴파일에서 지정할 수 있습니다.
함수별로 부동 소수점 동작을 제어하는 방법은 float_control pragma를 참조하십시오.
/fp:strict, /fp:except 및 상응하는 pragmas, fp_contract pragma와 관련된 대부분의 부동 소수점 최적화 동작은 컴퓨터에 따라 달라집니다. /fp:strict 및 /fp:except는 /clr과 함께 사용할 수 없습니다.
/fp:precise로 응용 프로그램의 부동 소수점 요구 사항 대부분을 처리할 수 있습니다. 필요한 경우 /fp:except와 /fp:strict를 사용할 수 있지만 이 경우 성능이 약간 저하될 수 있습니다. 성능이 더 중요한 경우 /fp:fast를 사용할 수 있습니다.
/fp:strict, /fp:fast 및 /fp:precise는 정밀도(정확도) 모드입니다. 이러한 옵션은 한 번에 하나만 적용할 수 있습니다. /fp:strict와 /fp:precise를 지정하면 컴파일러는 마지막에 처리한 옵션을 사용합니다. /fp:strict와 /fp:fast를 함께 지정할 수는 없습니다.
자세한 내용은 https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/floapoint.asp를 참조하십시오.
Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면
프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 방법: 프로젝트 속성 페이지 열기를 참조하십시오.
구성 속성 노드를 확장합니다.
C/C++ 노드를 확장합니다.
코드 생성 속성 페이지를 선택합니다.
부동 소수점 모델 속성을 수정합니다.
프로그래밍 방식으로 이 컴파일러 옵션을 설정하려면
- floatingPointModel을 참조하십시오.