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
'Program Tip' 카테고리의 다른 글
NPM은 .gitignore에 나열된 파일을 무시합니까? (0) | 2020.11.01 |
---|---|
NSString containsString 충돌 (0) | 2020.11.01 |
XML에서 요소 또는 속성을 사용해야합니까? (0) | 2020.11.01 |
한 분기를 다른 분기처럼 만드는 git 명령 (0) | 2020.11.01 |
git 상태 성능을 개선하는 방법 (0) | 2020.11.01 |