math - 해결 - 파이썬 부동소수점 표현




부동 소수점(im) 정밀도로의 약간의 전환, 1 부 (7)

대부분의 수학자들은 다음과 같이 동의합니다.

πi + 1 = 0

그러나, 대부분의 부동 소수점 구현은 동의하지 않습니다. 이 분쟁을 얼마나 잘 해결할 수 있습니까?

저는 다른 언어와 구현에 대해 듣고 싶어합니다. 가능한 한 제로에 가까운 결과를 내기위한 다양한 방법을 듣고 싶습니다. 창의력을 발휘하십시오!


사실, 기존 프로그래밍 언어로 i (또는 엔지니어의 경우 j)를 어떻게 표현합니까?

네이티브 표현이없는 언어에서는 일반적으로 OOP를 사용하여 ij 를 나타내는 Complex 클래스를 만들고 연산자 오버로드를 사용하여 다른 Complex numbers 및 / 또는 해당 언어 고유의 다른 숫자 프리미티브와 관련된 작업을 올바르게 처리합니다 .

예 : Complex.java , C ++ <complex>


@ 라이언 폭스

사실, 기존 프로그래밍 언어로 i (또는 엔지니어의 경우 j)를 어떻게 표현합니까?

원시 복합 데이터 유형은 아직까지 알려지지 않았습니다. Fortran은 60 년대 중반까지 그것을 가지고 있었고, OP는 hist followup에서 그들을 지원하는 다양한 다른 언어를 보여줍니다.

그리고 복소수를 다른 언어에 라이브러리로 추가 할 수 있습니다 (연산자 오버로드를 사용하면 코드의 기본 유형처럼 보일 수도 있습니다).

그러나이 문제에 대한 특별한 경우를 제공하지 않는 한 "비 동의"는 부정확 한 기계 산술의 표현 일뿐입니다. 그것은 불평처럼

float r = 2/3;
float s = 3*r;
float t = s - 2;

(t! = 0)으로 끝납니다 (적어도 멍청한 컴파일러를 사용한다면 ...).


귀하의 질문은 당신이 부동 소수점 수학이 언어에 의해 구현되었다고 제안하는 것처럼 보이기 때문에 조금 이상하게 보입니다. FP 수학은 하드웨어에서 부동 소수점 프로세서를 사용하여 수행되므로 일반적으로 사실이 아닙니다. 그러나 소프트웨어 나 하드웨어, 부동 소수점은 항상 부정확합니다. 그게 바로 수레가 작동하는 방법입니다.

더 나은 정밀도가 필요한 경우 다른 숫자 표현을 사용해야합니다. int 또는 long에 맞지 않는 숫자에 대해 정수 연산을 수행하는 것과 같습니다. 일부 언어에는 내장 라이브러리 (BigInteger와 BigDecimal을 가진 Java가 있음)가 있지만 네이티브 유형 대신 라이브러리를 명시 적으로 사용해야하고 부동 소수점을 사용하는 경우보다 성능이 (때로는 현저히) 저하 될 수 있습니다.


지금까지 시도한 구현 및 언어의 짧은 목록이 있습니다. 친밀감을 기준으로 정렬됩니다.

  • Scheme : (+ 1 (make-polar 1 (atan 0 -1)))
    • 0.0+1.2246063538223773e-16i (Chez Scheme, MIT Scheme)
    • 0.0+1.22460635382238e-16i (Guile)
    • 0.0+1.22464679914735e-16i (닭고기 달걀 수)
    • 0.0+1.2246467991473532e-16i (MzScheme, SISC, Gauche, Gambit)
    • 0.0+1.2246467991473533e-16i (SCM)
  • Common Lisp : (1+ (exp (complex 0 pi)))
    • #C(0.0L0 -5.0165576136843360246L-20) (CLISP)
    • #C(0.0d0 1.2246063538223773d-16) (CMUCL)
    • #C(0.0d0 1.2246467991473532d-16) (SBCL)
  • Perl : use Math::Complex; Math::Complex->emake(1, pi) + 1 use Math::Complex; Math::Complex->emake(1, pi) + 1
    • 1.22464679914735e-16i
  • 파이썬 : from cmath import exp, pi; exp(complex(0, pi)) + 1 from cmath import exp, pi; exp(complex(0, pi)) + 1
    • 1.2246467991473532e-16j (CPython)
  • Ruby : require 'complex'; Complex::polar(1, Math::PI) + 1 require 'complex'; Complex::polar(1, Math::PI) + 1
    • Complex(0.0, 1.22464679914735e-16) (MRI)
    • Complex(0.0, 1.2246467991473532e-16) (JRuby)
  • R : complex(argument = pi) + 1
    • 0+1.224606353822377e-16i

수치 해석은 큰 숫자 사이의 작은 차이의 정확한 값에 의존 할 수 없다는 것을 알려줍니다.

이것은 문제의 방정식에 영향을 미치지 않고, 다항식의 0을 찾는 것부터 log (~ 1) 또는 exp (~ 0)를 평가하는 것에 이르기까지, 거의 방정식이 아닌 연립 방정식을 풀 때부터 모든 것에 불안정성을 가져올 수 있습니다 ( 나는 log (x + 1)과 (exp (x) -1)를 계산하기위한 특별한 함수를 보았다.

나는 당신이 차이를 제로로한다는 관점에서 생각하지 말 것을 권장합니다 - 당신은 할 수 없습니다 - 오히려 최소한의 실수를 보장하는 것과 같은 방식으로 연관된 계산을하는 것입니다.

미안 해요, 제가 유니에 나와 드럼을 연주한지 43 년이 지났습니다. 참고 문헌을 기억할 수 있다고해도, 지금은 주변에 더 좋은 것들이있을 것입니다. 나는 이것을 출발점으로 제안한다.

그게 조금 후회하는 소리가 들린다면, 사과드립니다. 당시의 CS가 그리 많지 않았기 때문에 "화학 분석 101"을 화학 과정에 포함 시켰습니다. 나는 현대 CS 과정에서 장소 / 중요성 수치 분석에 대한 느낌을 갖지 못했다.


이 분쟁을 해결할 수 있습니까?

나의 첫 번째 생각은 메이플 (Maple )과 같은 상징적 인 언어를 찾는 것이다. 나는 그것이 부동 소수점으로 생각한다고 생각하지 않는다.

사실, 기존 프로그래밍 언어로 i (또는 엔지니어의 경우 j) 를 어떻게 표현합니까?

아마도 더 좋은 예가 죄 (π) = 0입니까? (또는 나는 다시 그 요점을 놓쳤는가?)


현재의 부동 소수점 계산 구조의 한계입니다. 부동 소수점 산술은 e 또는 pi와 같은 숫자 기둥의 근사치 또는 비트가 허용하는 정밀도를 초과하는 것입니다. 그들은 분류를 무시하고 표준 시리즈 인 소수보다 더 큰 엔트로피 (?)를 갖는 것처럼 보이기 때문에이 숫자를 정말로 즐깁니다. 비율은 숫자 표현을 무시합니다. 때로는 단순한 일이 사람의 마음을 불어 넣을 수 있습니다 (나는 그것을 좋아합니다).

다행히도 전체 언어와 라이브러리는 표기법 개념 ( Lasse V. Karlsen의 설명과 유사)을 사용하여 정밀 삼각 함수에 전념 할 수 있습니다.

기계가 이해할 수있는 형식으로 e 및 pi와 같은 개념을 설명하는 라이브러리 / 언어를 고려하십시오. 기계에 완벽한 원이 무엇인지에 대한 개념이 있습니까? 아마도 아닙니다. 그러나 우리는 우리가 그것에 붙어있는 모든 알려진 피쳐 (일정한 반경, 원주에 대한 반지름의 관계는 2 * pi * r = C)를 만족시키는 객체 - 원을 만들 수 있습니다. pi와 같은 객체는 위에서 언급 한 비율로만 설명됩니다. r & C는 원하는 정확도로 설명 된 숫자 객체가 될 수 있습니다. e는 "e가 x = 0 지점에서 함수 f (x) = ex의 미분 값 (접선의 기울기)이 정확히 1"이되도록 고유 실수가 정의 될 수 있습니다.

재미있는 질문.





floating-point