2017-01-29 7 views
1

부동 소수점 사용자는 반올림 오류를주의해야합니다. 예를 들어, 1.0/3*3 == 1은 거의 모든 현대 프로그래밍 언어에서 false로 평가됩니다. 더 특별하게 nonspecialists를 위해, 의외로 1.0/10*10 == 1.부동 소수점과 반올림 오류 방지

그러나 이러한 문제를 해결할 수있는 부동 소수점 시스템이 있습니다. 특히 Apple II와 Commodore Vic-20의 에뮬레이터에서 위의 두 가지 테스트를 모두 시도했으며 각각의 표현은 각 경우에 true로 평가되었습니다. 반 직관적입니다 : 매우 원시적 인 시스템은 훨씬 더 진보 된 시스템보다 잘 작동하는 것 같습니다.

위의 테스트에서 이전 부동 소수점 시스템이 원하는 대답을 얻었습니까? 현대의 IEEE 부동 소수점이 다른 이유를 가지고 있다고 가정하면 교환으로 무엇을 얻을 수 있습니까? 또는 다른 말로하면 가장 까다로운 종류의 반올림 오류없이 1/10과 1/3을 나타낼 수 있었지만 이전 부동 소수점 시스템을 포기한 문제는 무엇입니까?

편집 : Simon Byrne은 위에 나열된 정확한 테스트를 올바르게 지적합니다. 실제로 IEEE 부동 소수점을 전달합니다. 나는 그것들과 어떤 실수를했는지, 그것을 재현 할 수 없다는 것을 전혀 모른다. 그러나 여기에 실패 하나는 지금 파이썬에서 시도의 : 정확한 시험 방법을 기존 시스템이 그 결과를 얻을 수 없었기 때문에 다시 애플 II에 성공하고, 트레이드 오프는 무엇 이었습니까

>>> 0.1+0.1+0.1 == 0.3 
False 

인가?

+0

기록 부분에 응답 할 수는 없지만 번호를 부동으로 저장할 수 있습니다. Clojure는 불합리한 수를 대신 분수로 저장하는 "분수"클래스를 가지고 있으므로 절대적으로 필요 할 때까지 반올림하지 않습니다. – Carcigenicate

+0

@Carcigenicate 오른쪽이지만, 분수로 숫자를 저장하는 것은 유용하게 예측할 수 있다면 임의의 정밀도로 수행해야합니다. 따라서 CPU 및 메모리 요구로 이어 지므로 대부분의 경우 부동 소수점을 사용합니다. – rwallace

+2

사용중인 언어/플랫폼은 무엇입니까? 요즘 꽤 유비쿼터스 인 IEEE754 binary64를 사용하는 모든 언어/플랫폼에서'1.0/3 * 3 == 1'과 '1.0/10 * 10 == 1'이 모두 true이어야합니다. –

답변

1

내 생각 엔 그들은 당신이 선택한 특정 예제에 대해 아마 운이 좋았을 것입니다.예를 들어, 문은 IEEE754의 binary32 연산에 사실 :

>>> import numpy as np 
>>> np.float32(0.1) + np.float32(0.1) + np.float32(0.1) == np.float32(0.3) 
True 

하는 정확한 세부 사항은 소프트웨어가 제공하는 무엇에 의존했다, 그래서 애플 II는 (부동 소수점 하드웨어를 제공하지 않은 this posting을 기반으로하고있는 것처럼 소리 다른 소프트웨어는 다른 구현을 제공함). 같은 24 비트 유효 숫자 (또는 비슷한 결과를 얻은 다른 값)를 사용하면 동일한 대답을 볼 수 있습니다.

UPDATE : this document 당신이 binary32 같은 결과를보고 이유를 설명 할 수있는, (이전 링크가 제안하는 것처럼 보였다으로하지 25 – 24 플러스 암시 1 –) 애플 소프트 베이직은 24 비트의 유효 숫자를 사용 않았 음을 표시하는 것 산수.

2

수학적으로 무한히 많은 소수가 있기 때문에 수학적으로 모든 분수를 정확하게 나타낼 수있는 수식 시스템의 기초를 찾을 수 없습니다. 분수를 정확하게 저장하려면 분자와 분모를 개별적으로 저장해야하므로 계산이 더 복잡해집니다.

분수를 단일 값으로 저장하면 일부 연산에서 작은 오류가 발생합니다. 반복적으로 수행하면 오류가 누적되어 눈에 띄게 될 수 있습니다. 당신이 공통 분모를 찾아 그하여 규모의 모든 값과 정수를 사용할 수있는 경우

  • :

    이 문제를 해결 두 가지 방법이 있습니다. 예를 들어, 부동 소수점 달러 대신 정수 센트를 사용하십시오.

  • 해당하는 경우 숫자를 반올림하십시오. 여러 번, 최대 정밀도보다 1 ~ 2 자리 작은 부동 소수점을 인쇄하면 충분합니다.

정수와 같이 부동 소수점 수를 테스트 할 수 없습니다. 두 그룹의 사람을 세고 그룹의 크기가 같은지 테스트하고 두 병의 우유가 같은지 테스트하는 것입니다.
"우유"테스트의 경우, 금액이 여전히 "동등한"것으로 간주되기 위해 얼마만큼 차이가 나는지 말할 필요가 있습니다.

Apple II에는 부동 소수점 하드웨어가 없었으므로 부동 소수점 계산이 가능한 BASIC이었습니다. 나는 그들이 동등성 테스트를 위해 그런 에러 바운드를 포함 시켰거나 기본 10 숫자 (BCD, harold의 코멘트 참조)를 사용했다고 생각한다.

+0

harold에 대한 제 대답대로 BCD는 여기에 설명이없는 것 같습니다. 동등성 테스트에 대한 오류 바인딩은 가능한 설명 또는 대체 라운딩 규칙 일 수 있습니다. 나는 그 사람들을 어떻게 구별 할 것인지를 고민하고있다. – rwallace

+0

제 Apple II는 IEEE 754 산술보다 오래되었습니다. 2 진수 또는 16 진수 부동 소수점을 사용하는 경우에도 반올림 규칙이 다를 수 있으므로 오류 사례가 달라집니다. –

+0

@PatriciaShanahan 예, 그렇습니다. 이제 내가 알 수있는 한 가지 오류 경우에는 이전 시스템이 실제로 더 잘 작동합니다. 그러나 IEEE는 새로운 시스템에 많은 생각을했습니다. 변경 사항을 정당화하기 위해 IEEE가 더 잘 작동하는 오류 사례는 무엇입니까? – rwallace