Float를 int와 비교할 때 Splint(C 코드 검사기)에서 오류가 발생하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/38027

  •  09-06-2019
  •  | 
  •  

문제

둘 다 수학적 값이지만 부동 소수점이 더 정확합니다.그것이 오류의 유일한 이유입니까? 정밀도의 차이입니까?아니면 또 다른 잠재적인(그리고 더 심각한) 문제가 있습니까?

도움이 되었습니까?

해결책

이는 정수 값 집합이 '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.

이 문제를 해결해야 하는 경우(합당한 이유가 있고 다른 답변에 언급된 문제 중 어느 것도 문제가 되지 않는 것에 만족함) 한 유형에서 다른 유형으로 캐스팅하면 됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top