float가 정수인지 확인하는 중
어떻게 하면 다음 정보를 확인할 수 있나요?float
변수에 정수 값이 포함되어 있습니까?지금까지 사용하고 있는 것은, 다음과 같습니다.
float f = 4.5886;
if (f-(int)f == 0)
printf("yes\n");
else printf("no\n");
하지만 더 나은 해결책이 있는지, 아니면 이 해결책에 단점이 있는지 궁금합니다.
이미 제시된 훌륭한 답변 외에ceilf(f) == f
또는floorf(f) == f
. 두 표현 모두 반환됩니다.true
한다면f
는 정수입니다.그들은 또한 돌아온다.false
NaN의 경우(NaN은 항상 동일하지 않음) 및true
(±digm)의 경우 잘라낸 결과를 유지하는 데 사용되는 정수 유형을 오버플로하는 데 문제가 없습니다.floorf()
/ceilf()
돌아가다float
s.
여기서 설명하는 대부분의 기법은 이전 계산에 의한 반올림 오차가 요인이 아니라고 가정할 때 유효하다는 점에 유의하십시오.예:roundf
, 다음과 같이 합니다.
float z = 1.0f;
if (roundf(z) == z) {
printf("integer\n");
} else {
printf("fraction\n");
}
이 기술 및 기타 유사한 기술의 문제(예:ceilf
, 캐스팅 대상long
, etc)는 정수 정수에서는 정상적으로 동작하지만 숫자가 부동소수점 반올림 오류의 영향을 받는 계산의 결과일 경우 실패합니다.예를 들어 다음과 같습니다.
float z = powf(powf(3.0f, 0.05f), 20.0f);
if (roundf(z) == z) {
printf("integer\n");
} else {
printf("fraction\n");
}
실제 계산 결과는 2.9999928474426953125이므로 20(3)은1/20 3이어야 하지만 "fraction"을 인쇄합니다.
비슷한 방법이든 상관없습니다.fmodf
뭐 그런 거라도 이 대상이에요.복잡하거나 반올림하기 쉬운 계산을 수행하는 응용 프로그램에서는 일반적으로 "전체 수"를 구성하는 "공차" 값을 정의합니다(일반적으로 부동 소수점 등가 비교에 해당).우리는 종종 이것을 엡실론이라고 부릅니다.예를 들어, 최대 +/- 0.00001 반올림 오류를 허용할 수 있다고 가정합니다.그럼, 만약 우리가 테스트하고 있다면z
엡실론을 0.00001로 선택하여 다음 작업을 수행할 수 있습니다.
if (fabsf(roundf(z) - z) <= 0.00001f) {
printf("integer\n");
} else {
printf("fraction\n");
}
별로 사용하고 싶지 않으시군요.ceilf
여기 있습니다. ceilf(1.0000001)
1이 아니라 2입니다.ceilf(-1.99999999)
-2가 아니라 -1입니다.
사용할 수 있습니다.rintf
대신해서roundf
괜찮으시다면요
애플리케이션에 적합한 허용 오차 값을 선택합니다(예, 허용 오차 0이 적절할 수도 있습니다).자세한 내용은 부동 소수점 수 비교에 대한 이 문서를 참조하십시오.
if (fmod(f, 1) == 0.0) {
...
}
잊지 마세요.math.h
그리고.libm
.
if (f <= LONG_MIN || f >= LONG_MAX || f == (long)f) /* it's an integer */
이것은 계산 반올림 문제를 다룬다.원하는 대로 엡실론을 설정합니다.
bool IsInteger(float value)
{
return fabs(ceilf(value) - value) < EPSILON;
}
stdlib float modf(float x, float *ipart)가 두 부분으로 분할되어 반환값(비교적 부분) == 0인지 확인합니다.
#define twop22 (0x1.0p+22)
#define ABS(x) (fabs(x))
#define isFloatInteger(x) ((ABS(x) >= twop22) || (((ABS(x) + twop22) - twop22) == ABS(x)))
100% 확신할 수는 없지만 f를 int에 넣고 f에서 빼면 다시 float로 던져지는 것 같습니다.이 경우 문제가 되지 않을 수 있지만 어떤 이유로든 int가 될 것으로 예상되면 문제가 발생할 수 있습니다.
더 예를 할 수 . 예를 들어 다음과 같습니다. float f = 4.5886; bool isInt; isInt = (f % 1.0 != 0) ? false : true;
컴파일러에 따라서는 1 뒤에 0.0이 필요할 수도 있고 필요 없을 수도 있습니다.다시 암묵적인 캐스트 전체가 실행됩니다.이 코드에서는 소수점 오른쪽이 모두 0이면 bool isInt가 true이고 그렇지 않으면 false가 됩니다.
언급URL : https://stackoverflow.com/questions/5796983/checking-if-float-is-an-integer
'programing' 카테고리의 다른 글
Java: String 초기화 방법 [] (0) | 2022.07.04 |
---|---|
Java에서 경로를 결합하는 방법 (0) | 2022.07.04 |
클린 모드에서 일식을 실행하는 방법그렇게 하면 어떻게 되나요? (0) | 2022.07.03 |
여러 조건에 따라 배열 내의 항목 값을 변경하려면 어떻게 해야 합니까? (0) | 2022.07.03 |
어레이 자동 갱신에 Dynamite Vue 컴포넌트가 필요한 이유 (0) | 2022.07.03 |