Program Tip

C 부동 소수점 리터럴을 double이 아닌 부동 소수점으로 만듭니다.

programtip 2020. 11. 1. 18:32
반응형

C 부동 소수점 리터럴을 double이 아닌 부동 소수점으로 만듭니다.


C에서 부동 소수점 리터럴 (예 :) 1.23이 type을 갖는다 는 것은 잘 알려져 있습니다 double. 결과적으로이를 포함하는 모든 계산은 두 배로 승격됩니다.

단 정밀도 ( float) 숫자 만 지원하는 부동 소수점 단위가있는 임베디드 실시간 시스템에서 작업 중입니다 . 내 모든 변수는 float이며이 정밀도로 충분합니다. 나는 전혀 필요하지 않습니다 double. 하지만 매번 뭔가

if (x < 2.5) ...

쓰이면 재앙이 발생합니다. 감속은 최대 2 배까지 증가 할 수 있습니다. 물론 직접적인 대답은

if (x < 2.5f) ...

그러나 이것은 놓치기 쉽습니다 (너무 늦게까지 감지하기 어렵습니다). 특히 '구성'값이 #define덜 훈련 된 (또는 그냥 새로운) 개발자가 별도의 파일에 'd '할 때 그렇습니다 .

그래서 컴파일러가 모든 (부동 소수점) 리터럴을 마치 접미사처럼 float로 처리하도록 강제하는 방법이 f있습니까? 사양에 어긋나더라도 상관 없어요. 아니면 다른 해결책이 있습니까? 그런데 컴파일러는 gcc입니다.


-fsingle-precision-constant플래그를 사용할 수 있습니다. 정확하지 않은 경우에도 부동 소수점 상수가 단 정밀도로로드되도록합니다.

참고-배정 밀도 변수에 대한 연산에서도 단 정밀도 상수를 사용합니다.


대신 경고를 사용하십시오 . 예에서와 같이 암시 적 부동에서 이중 승격 -Wdouble-promotion에 대해 경고 합니다. 수레에 복식을 할당 할 수있는 경우에 대해 경고합니다.-Wfloat-conversion

이것은 단순히 double 값을 가장 가까운 float 값으로 강제하는 것보다 더 나은 솔루션입니다. 부동 소수점 코드는 여전히 호환되며 double 값이 양수 값, 예를 들어보다 작거나 FLT_DENORM_MIN(IEEE-754 가정) FLT_MAX.


정의 된 상수를 (float)사용되는 위치 로 캐스트 할 수 있으며 옵티마이 저가 작업을 수행해야합니다. 이것은 휴대용 솔루션입니다.

#define LIMIT 2.5

if (x < (float)LIMIT) ...

-Wunsuffixed-float-constants플래그는 아마도 위의 허용 대답에 다른 옵션의 일부와 결합도 사용할 수있다. 그러나 이것은 아마도 시스템 헤더에서 접미사가없는 상수를 포착하지 못할 것입니다. -Wsystem-headers그것들을 잡기 위해 사용해야 할 것입니다. 많은 경고를 생성 할 수 있습니다 ...

참고 URL : https://stackoverflow.com/questions/32266864/make-c-floating-point-literals-float-rather-than-double

반응형