Float를 int와 비교할 때 Splint(C 코드 검사기)에서 오류가 발생하는 이유는 무엇입니까?
문제
둘 다 수학적 값이지만 부동 소수점이 더 정확합니다.그것이 오류의 유일한 이유입니까? 정밀도의 차이입니까?아니면 또 다른 잠재적인(그리고 더 심각한) 문제가 있습니까?
해결책
이는 정수 값 집합이 'int' 및 'float' 유형의 부동 소수점 값 집합과 동일하지 않기 때문입니다.예를 들어, float 값 0.5는 정수 집합에 동일하지 않으며 정수 값 4519245367은 float가 저장할 수 있는 값 집합에 존재하지 않을 수 있습니다.따라서 검사기는 이를 프로그래머가 검사해야 할 문제로 표시합니다.
다른 팁
아마도 별로 좋은 생각이 아니기 때문입니다.모든 부동 소수점이 정수로 잘릴 수 있는 것은 아닙니다.모든 int를 float로 변환할 수 있는 것은 아닙니다.
비교를 수행할 때 정수 값은 부동 소수점 값으로 "승격"됩니다.그 시점에서 두 개의 부동 소수점 숫자 사이의 정확한 동일성 비교를 수행하게 되는데, 이는 거의 항상 나쁜 일입니다.
일반적으로 일종의 "엡실론 공" 또는 허용 가능한 값 범위가 있어야 하며 두 값이 동일하다고 간주될 만큼 서로 충분히 가까운 경우 비교를 수행합니다.대략 다음과 같은 기능이 필요합니다.
int double_equals(double a, double b, double epsilon)
{
return ( a > ( b - epsilon ) && a < ( b + epsilon ) );
}
애플리케이션에 엡실론을 확실히 선택할 수 없는 경우 DBL_EPSILON을 사용하세요.
float는 정확한 int 값을 저장할 수 없기 때문에 int i와 float f라는 두 개의 변수가 있는 경우 "i = f;"를 할당하더라도 "if (i == f)" 비교는 아마도 그렇지 않을 것입니다. 사실을 반환합니다.
부호 있는 정수와 IEEE 부동 소수점 형식을 가정하면 표현할 수 있는 정수의 크기는 다음과 같습니다.
short -> 15 bits
float -> 23 bits
long -> 31 bits
double -> 52 bits
그러므로 float
무엇이든 대표할 수 있다 short
그리고 double
무엇이든 대표할 수 있다 long
.
이 문제를 해결해야 하는 경우(합당한 이유가 있고 다른 답변에 언급된 문제 중 어느 것도 문제가 되지 않는 것에 만족함) 한 유형에서 다른 유형으로 캐스팅하면 됩니다.