문제

그래서 나는 플로팅 포인트 정밀도 (그리고 1.1과 같은 것들이 바이너리로 정확하게 표현할 수없는 방법)와 그 모든 것에 대해 알고 있지만, 어떻게 궁금합니다. 어떻게 수학 관련 라이브러리가 무한한 정밀도를 구현합니까? 다시 말해, 예를 들어 바이너리에서 1.1을 어떻게 정확하게 표현합니까? 간단한 설명은 좋을 것입니다. 정확한 세부 사항을 직접 알아낼 수 있습니다. 감사. :)

도움이 되었습니까?

해결책

무한한 정밀 라이브러리는 없지만 임의의 정밀 라이브러리가 있습니다. 구현 방법에 대한 자세한 내용은 일부를 읽으십시오. 선적 서류 비치 :-)

바이너리에서 정확히 1.1을 나타내려면, 올바르게 지적한대로 부동 소수점을 사용할 수 없습니다. 정수 (1)을 정수로, 분수 부분 (.1)을 다른 정수로 저장하면 이러한 구조를 처리하기 위해 논리를 만들어야합니다. 대안 적으로, 분모 및 분자로 저장된 분수 (11/10)로 저장 될 수있다.

다른 팁

당신이 정말로 무한한 정밀도를 의미한다면 두 가지 옵션이 있습니다.

  • 게으른 계산의 일부 형태를 사용하십시오. 그런 다음 계산을 실행하는 "후"를 좋아하는 것보다 많은 정밀도를 요구할 수 있습니다 (실제로 게으른 것이기 때문에 실제로 수행되었습니다). 단점은 이것이 매우 비효율적이라는 것입니다. 표현이 겹치는 특수 번호 시스템을 사용하여 Haskell과 같은 언어 로이 작업을 수행 할 수 있습니다. 예를 들어 -1, 0, 1의 숫자가있는 기본 2는 적합하지 않습니다. 0.999 ... 1.000의 경우 1 ...

  • 상징적으로 계산을 수행하십시오. 정수, 합리적, 뿌리 등을 정확하게 나타냅니다. 평등을 결정하려면 비효율적이고 특별한 경우로 제한되는 경우에도 필요합니다.

수학 라이브러리 무한 정밀도는 구현되지 않습니다. 할 수 없습니다. 숫자 1/3은 분수 이외의 유한 수의 비트로 표현할 수 없습니다. Pi 및 E와 같은 초월적인 숫자는 어떤 방식 으로든 완전히 표현할 수 없습니다.

반면에, 수학 라이브러리를 만들 수 있습니다. 거대한 정도. 부동 소수점 값의 만티 사를 위해 충분한 비트를 할당하는 것은 모두 문제입니다.

정확한 산술에 의존하는 특정 기하학적 알고리즘이 있으므로 CGAL 라이브러리를 보면 다양한 작업에서 "닫힌"다양한 정확한 숫자 유형을 찾을 수 있습니다. 즉, 지원되는 작업을 사용하여 정확하게 표현할 수없는 결과를 생성하는 방법이 없습니다.

몇 가지 예 :

  • 정수는 첨가 및 곱셈으로 닫힙니다.

  • 합리적은 제로의 특별한 경우를 제외하고는 부서 하에서 폐쇄됩니다. 한 쌍의 정수로 표시 될 수 있습니다. 참조 GMP의 합리적 번호 기능. 예를 들어 1.1 = 11/10은 (11, 10)으로 표시 될 수 있습니다.

  • 제곱근 아래에서 닫힌 숫자 유형.

소수점의 숫자를 나타내고 소수점 산술을 할 수도 있습니다. 기본 표현은 각 숫자가 이진 코드로 표시된다는 의미에서 이진입니다. 소수점의 왼쪽 또는 오른쪽에 관계없이 각 숫자는 정수로 취급됩니다. 그런 다음 산술은``수동으로 '', 숫자별로 수행됩니다.

소수점 기반 라이브러리의 한 예는 PHP의 BCMATH입니다.

우리가 떠 다니는 지점과 숫자에 대해 이야기 할 때 PAX는 여기에 있지만 해결책이 있다고 생각하지만 매우 비효율적입니다.
문자열을 사용하여 숫자를 나타낼 수 있으며, 문자열은 정밀도를 잃지 않습니다.
"0.0001" + "0.1"과 같은 숫자가있을 때마다 두 문자열을 반복하고 현재 위치 만 int로 변환합니다.
1 단계:
0 + 0 = 0-> 문자열로 변환하고 데이터 [0]로 할당합니다.
2 단계:
0 + 1 = 1-> 문자열로 변환하고 데이터로 지정 [1].
3 단계 : :
iter> "0.1".lenght () -> 정지.

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