C 부동 소수점 리터럴을 플로팅(이중값이 아닌)
C에서는 부동 소수점 리터럴(예: 부동 소수점 리터럴)로 잘 알려져 있습니다.1.23
)의 타입이 있습니다.double
그 결과, 이러한 계산과 관련된 모든 계산은 2배로 승격됩니다.
단정도만 지원하는 부동소수점 단위를 가진 임베디드 실시간 시스템을 개발하고 있습니다.float
)의 번호입니다.모든 변수는float
이 정도로는 충분합니다.필요 없다(여력도 없다)double
조금도.하지만 매번 뭔가
if (x < 2.5) ...
기록, 재해 발생: 속도 저하가 최대 2배까지 증가할 수 있습니다.물론, 직접적인 대답은 글을 쓰는 것이다.
if (x < 2.5f) ...
그러나 이는 놓치기 쉬우며(또한 너무 늦어질 때까지 감지하기가 어렵습니다), 특히 '구성' 값이#define
훈련 수준이 낮은(또는 신규) 개발자에 의해 별도의 파일에 저장되었습니다.
컴파일러가 모든 (부동소수점) 리터럴을 접미사와 같이 플로트 처리하도록 강제하는 방법이 있습니까?f
사양에 어긋난다고 해도 상관없어요.아니면 다른 솔루션은요?참고로 컴파일러는 gcc입니다.
대신 경고 사용:-Wdouble-promotion
예시와 같이 암묵적인 플로트에 대해 경고합니다. -Wfloat-conversion
는 플로트에 더블을 할당할 수 있는 경우에 대해 경고합니다.
이것은 단순히 두 배의 값을 가장 가까운 부동 값으로 강제하는 것보다 더 나은 해결책입니다.부동소수점 코드는 여전히 준수하고 있으며, 이중값이 예를 들어 다음 값보다 작은 양의 값을 갖는다고 해도 불쾌한 놀라움은 발생하지 않습니다.FLT_DENORM_MIN
(IEEE-754를 전제로) 또는 그 이상FLT_MAX
.
-fsingle-precision-constant
플래그를 사용할 수 있습니다.정확하지 않은 경우에도 부동소수점 상수가 단일 정밀도로 로드됩니다.
참고- 또한 이중 정밀도 변수에 대한 연산에 단일 정밀도 상수를 사용합니다.
그-Wunsuffixed-float-constants
플래그를 사용할 수도 있습니다.아마도 위의 승인된 답변의 다른 옵션과 조합할 수 있습니다.그러나 이것은 시스템 헤더에서 고정되지 않은 상수를 포착하지 못할 수 있습니다.사용할 필요가 있다-Wsystem-headers
그걸 잡으려고요.많은 경고를 생성할 수 있습니다...
정의된 상수를 다음에 캐스팅할 수 있습니다.(float)
어디에 사용되든 옵티마이저는 제 역할을 해야 합니다.이것은 휴대용 솔루션입니다.
#define LIMIT 2.5
if (x < (float)LIMIT) ...
언급URL : https://stackoverflow.com/questions/32266864/make-c-floating-point-literals-float-rather-than-double
'programing' 카테고리의 다른 글
Vuetify 데이터 테이블에 데이터가 표시되지 않습니다. (0) | 2022.08.23 |
---|---|
Vuex에서 커밋을 트리거하기 위해 getter 및 setter와 함께 계산된 속성을 사용하는 방법 (0) | 2022.08.23 |
특정 코드 줄에 대해 특정 Checkstyle 규칙을 비활성화하시겠습니까? (0) | 2022.08.23 |
C 및 C++ : 자동구조 부분 초기화 (0) | 2022.08.23 |
getter에서 rootState를 가져올 수 없습니다. (0) | 2022.08.23 |