== 연산자를 사용하여 두 개의 둥근 부동 소수점 번호를 비교하는 것이 맞습니까?

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

문제

아니면 운영이 실패 할 가능성이 있습니까?

감사.

나는 잘못된 용어를 선택했고 실제로 의미하는 바는 잘린 것이 아니라 0으로 반올림하는 것이 었습니다.

요점은 두 개의 복식의 정수 부분을 비교해야한다는 것입니다. 그냥 int로 캐스팅 한 다음 ==를 사용하는 것입니다. 이중은 정수에 맞지 않습니다.

따라서 질문은 '== 연산자를 사용하여 이전에 0으로 반올림 된 두 개의 복식을 비교하는 것이 맞습니까?

도움이 되었습니까?

해결책

업데이트 된 사이트는 다음과 같습니다 부동 소수점 번호를 비교하는 몇 가지 방법의 장단점에 대해 논의합니다. (여전히 볼 수 있습니다 여기에 오래된 사이트.)

내가 함께 갈 수있는 방법은 "상대 오류"방법입니다. 두 숫자의 차이를 찾고, 숫자의 백분율로 변환하고, 그 백분율이 충분히 작 으면 평등이 있습니다.

다른 팁

더 나쁜 것은 때때로, 똑같은 숫자의 경우에도 실패한다는 것입니다. 일부 컴파일러 또는 프로세서는 메모리보다 CPU 레지스터에서 더 많은 정밀도를 사용하기 때문입니다 (예 : MSVC는 3 가지 부동 소수점 동작 옵션이 있습니다). 따라서 최근에 계산 된 값은 이러한 비트가 잘리지 않을 수 있으며 불평등 한 것처럼 보일 것입니다. 플로트에서 ==를 사용하지 마십시오.

부동 소수점 표현의 정상적인 문제로 인해 여전히 실패 할 수 있습니다. 그것들을 자르지 않고 동등한 정밀도를 나타내는 델타를 사용하십시오.

일반적으로 동일하게 고려할 두 개의 수레가있는 경우에는 실패 할 수 있습니다.

10.19999999

10.20000001

그러나 당신이 그들을 잘라 내면 그들은 다른 결과를줍니다.

10.19

10.20

반면, 차이와 비교하기 위해 0.001의 델타를 사용했다면,이 두 값이 효과적으로 동일하다는 것을 알았을 것입니다.

사용하는 것은 결코 맞지 않습니다 == 부동 소수점.

플로트 포인트 컨텍스트에서 "Truncate"는 무엇을 의미합니까? 어떤 특정 라이브러리 기능을 부르고 있습니까? 결과는 무엇입니까? "잘린"값이 비 번식되지 않은 값보다 더 비슷하다고 믿는 이유는 무엇입니까?

부동 소수점은 소수점 값의 근사치입니다. 부동 소수점은 두 가지의 힘 만 정확하게 나타낼 수 있습니다. 다른 모든 값은 어떤 부동 소수점 작업에 관계없이 약간의 오류가 발생합니다.

그러나 정수로 변환하면 사용할 수 있습니다. ==.

절대 값이 단일의 경우 2^23 미만 또는 두 배의 경우 2^52보다 낮은 경우 Round ()를 사용한 다음 비교를 수행 할 수 있습니다. 더 큰 값은 정확하게 저장 될 수 없으며 이것은 n == n+1의 상황을 열어줍니다.

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