2016-09-05 10 views
1

십진수를 이진수로 표현할 수없는 경우, 컴퓨터는 정확하게 표현할 수있는 두 정수의 소수로 숫자를 저장하지 않는 이유는 무엇입니까?십진수 부정확성을 해결하기 위해 분수를 사용하십시오.

  • 숫자가 어딘가에 표시 될 때마다 부정확 한 부동 소수점으로 변환 될 수 있습니다.
  • 추가 계산을 할 때마다 분수를 포함합니다.

이것은 근본적으로 부정확성의 문제를 해결해야하지만 모든 천재가 아니므로 이론에 무엇이 잘못 되었습니까?

숫자 0.1을 저장하고 추후 계산에 사용하려고합니다. 0.1로 저장하는 대신 1/10로 저장합니다 (따라서 분수를 저장하기 위해 더 많은 바이트가 필요합니다). 그런 다음 다른 숫자, 예를 들어 5로 곱해야 할 경우 오류를 3으로 곱하십시오. 1/10을 3으로 곱하면 1/10 * 3 = 3/10이됩니다. 그것을 표시해야 할 때마다 3/10이 부정확해질 수 있습니다. 그 때까지는 부정확성에 의문의 여지가 없습니다.

+1

존재하는 부동 소수점 형식은 계산시 쉽고 빠르게 사용할 수 있으며 하드웨어로 구현하기도 쉽습니다. 그것들은 또한 매우 작아서 포맷이 생성 될 당시 더욱 중요했습니다. –

+0

1/k의 합을 n보다 큰 k보다 작게 계산하면 분모의 크기 (비트)가 n과 관련하여 지수 적이라는 것을 알 수 있습니다. 부동 소수점 형식은 이러한 계산 결과에 대해 일정한 크기 (비트 단위)를 유지합니다. 근사값이라 할지라도 모든 부동 소수점 계산은 고정 된 경계 저장 영역과 고정 된 경계 시간에서 수행됩니다. 이는 "정확한"분수의 경우가 아닙니다. – Franck

답변

0

십진법은 중요하지 않습니다. 고전적인 유스 케이스는 누군가가 당신이 완전한 센트로 일할 수 있다는 것을 깨닫기에 충분히 똑똑해질 때까지 돈이었다.

현실은 어떤 기지도 선호하지 않는다는 것을 이해하는 것이 중요합니다. 호모 사피엔스의 중간 손가락 수에서 파생 된 기지는 아닙니다.

비율에 대해서는 sqrt(2) 또는 arctan(1)을 나타낼 수 없습니다. 그리고 이며 실제로 나타나는 숫자 유형입니다.

1

sqrt (MSalters에서 언급)과 같은 비합리적인 기능을 사용할 수 없다는 것 외에도, 합계가 매우 쉽게 오버플로 할 수있는 문제가 있습니다 (예 : 부부를 함께 곱하거나 뉴톤의 방법과 같은 반복적 인 루틴). 물론 임의의 정밀도 정수를 사용할 수는 있지만 느린 속도 일 수 있습니다. 그런 엄청난 수를 메모리에 저장해야합니다.

+0

BigInteger를 분자와 분모로 사용하여 BigRational 유형을 작성했습니다. 일반적으로 BigIntegers는 전혀 커지지 않습니다. –

+0

무엇을 사용하고 계셨습니까? –

+0

필자는 BigDecimal 삼각법, 지수법 등의 MacLaurin 시리즈를 필요한 정밀도로 계산하는 데 도움이되도록 작성했습니다. 그러나 그것도 자신의 유형으로 사용할 수 있습니다. 이것은 Java로 작성된 것이 아니며, BigInteger, BigDecimal 및 BigRational를 Object Pascal (및 일부 내장 어셈블러)에 작성했습니다. –