문제

대부분의 수학자들은 다음에 동의합니다.

이자형πi + 1 = 0

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

저는 다양한 언어와 구현, 그리고 결과를 가능한 한 0에 가깝게 만드는 다양한 방법에 대해 듣고 싶습니다.창의력을 발휘하세요!

도움이 되었습니까?

해결책

대부분의 부동 소수점 구현이 동의하지 않는 것이 아니라 단지 100% 답을 얻는 데 필요한 정확도를 얻을 수 없다는 것입니다.정답은 할 수 없다는 것입니다.

PI는 기호 표현 외에는 누구도 나타낼 수 없는 무한한 숫자 계열이며 e^X도 동일하므로 100% 정확도에 도달하는 유일한 방법은 기호를 사용하는 것입니다.

다른 팁

다음은 제가 시도한 구현 및 언어의 간단한 목록입니다.0에 가까운 순서로 정렬됩니다.

  • 계획: (+ 1 (make-polar 1 (atan 0 -1)))
    • 0.0+1.2246063538223773e-16i (Chez 계획, MIT 계획)
    • 0.0+1.22460635382238e-16i (교활)
    • 0.0+1.22464679914735e-16i (치킨과 numbers 계란)
    • 0.0+1.2246467991473532e-16i (MzScheme, SISC, Gauche, Gambit)
    • 0.0+1.2246467991473533e-16i (SCM)
  • 커먼 리스프: (1+ (exp (complex 0 pi)))
    • #C(0.0L0 -5.0165576136843360246L-20) (클립)
    • #C(0.0d0 1.2246063538223773d-16) (CMUCL)
    • #C(0.0d0 1.2246467991473532d-16) (SBCL)
  • 펄: use Math::Complex; Math::Complex->emake(1, pi) + 1
    • 1.22464679914735e-16i
  • 파이썬: from cmath import exp, pi; exp(complex(0, pi)) + 1
    • 1.2246467991473532e-16j (CPython)
  • 루비: require 'complex'; Complex::polar(1, Math::PI) + 1
    • Complex(0.0, 1.22464679914735e-16) (MRI)
    • Complex(0.0, 1.2246467991473532e-16) (J루비)
  • 아르 자형: complex(argument = pi) + 1
    • 0+1.224606353822377e-16i

이 분쟁을 해결하는 것이 가능합니까?

내 첫 번째 생각은 다음과 같은 상징적 언어를 찾는 것입니다. 단풍.그래도 부동 소수점으로 간주되지는 않는다고 생각합니다.

실제로 어떻게 표현하나요? (또는 제이 엔지니어를 위한) 기존 프로그래밍 언어로?

아마도 더 나은 예는 sin(π) = 0일까요?(아니면 제가 또 요점을 놓친 걸까요?)

저도 Ryan의 의견에 동의합니다. 다른 숫자 표현 시스템으로 전환해야 합니다.무한히 긴 소수점으로 표현하려면 파이가 필요하므로 제한된 정밀도 체계는 작동하지 않기 때문에 솔루션은 부동 소수점 수학 영역 밖에 있습니다. 정도).

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

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

@라이언 폭스

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

기본 복합 데이터 유형은 알려지지 않았습니다.Fortran은 60년대 중반에 그것을 가지고 있었고 OP는 그의 후속작에서 이를 지원하는 다양한 다른 언어를 보여줍니다.

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

하지만 이 문제에 대해 특별한 경우를 제시하지 않는 한, "불일치"는 단지 부정확한 기계 연산의 표현일 뿐이겠죠?불평하는거랑 비슷해요

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

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

나는 가장 친한 친구와 함께 불합리한 숫자와 다른 숫자 사이의 차이점에 대해 이야기하면서 커피 채팅을 아주 오랫동안 했습니다.음, 우리 둘 다 다음과 같은 다른 관점에 동의합니다.

무리수는 어떤 면에서 함수로서의 관계인가요?글쎄요, "완벽한 원을 원한다면 완벽한 파이를 주세요"라고 생각해보세요. 하지만 원은 다른 도형과 다릅니다(4변, 5, 6...100, 200) 그런데...면이 몇 개나 더 있나요? 마치 원처럼 보입니다.지금까지 나를 따라오셨다면 이 모든 아이디어를 여기에 연결하는 것이 파이 공식입니다.enter image description here

따라서 pi는 함수이지만 결코 끝나지 않는 함수입니다!매개변수 때문에 pi의 "인스턴스"를 가질 수 있다고 생각하고 싶습니다. 매우 큰 Int에 대해 무한 매개변수를 변경하면 매우 큰 pi 인스턴스를 갖게 됩니다.

e와 마찬가지로, 나에게 큰 매개변수를 주세요. 나는 당신에게 큰 e를 줄 것입니다.

모든 아이디어를 종합하면 다음과 같습니다.

메모리 제한이 있기 때문에 언어와 라이브러리는 우리에게 엄청난 양의 무리수 인스턴스를 제공합니다. 이 경우 pi와 e는 최종 결과로 @Chris Jester-Young이 제공한 예와 같이 0을 얻기 위해 오랜 접근 방식을 취하게 됩니다.

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

기본 표현이 없는 언어에서는 일반적으로 OOP를 사용하여 추가되어 Complex 대표하는 클래스 i 그리고 j, 다른 작업과 관련된 작업을 적절하게 처리하기 위해 연산자 오버로드가 포함됩니다. Complex 숫자 및/또는 해당 언어에 고유한 기타 숫자 프리미티브입니다.

예: Complex.java, C++ <복합>

수치 분석은 큰 숫자 사이의 작은 차이의 정확한 값에 의존할 수 없다는 점을 가르쳐줍니다.

이는 여기서 문제의 방정식에만 영향을 미치는 것이 아니라 거의 특이적인 연립 방정식 세트를 푸는 것부터 다항식의 영점 찾기, log(~1) 또는 exp(~0) 평가에 이르기까지 모든 것에 불안정성을 가져올 수 있습니다. 나는 이 문제를 해결하기 위해 log(x+1) 및 (exp(x)-1)을 평가하는 특수 함수도 보았습니다.

차이를 0으로 만드는 것은 불가능합니다. 오히려 오류를 최소화하는 방식으로 관련 계산을 수행하는 것이 좋습니다.

죄송합니다. 대학에서 이 말을 들은 지 43년이 지났습니다. 참고 문헌을 기억할 수 있더라도 지금은 더 좋은 것들이 있을 것이라고 확신합니다.나는 제안한다 이것 출발점으로.


조금 거슬리게 들렸다면 사과드립니다.당시에는 CS가 많지 않았기 때문에 "수치 분석 101"은 화학 과정의 일부였습니다.나는 현대 CS 과정에서 수치 분석이 갖는 위치/중요성에 대해 실제로 느낌이 없습니다.

이는 현재 부동 소수점 계산 아키텍처의 한계입니다.부동 소수점 연산은 e나 pi(또는 비트가 허용하는 정밀도를 넘어서는 모든 것)와 같은 숫자 극점의 근사치일 뿐입니다.나는 이 숫자들이 분류를 거부하고 표준 계열인 소수보다 더 큰 엔트로피(?)를 갖는 것처럼 보이기 때문에 정말 좋아합니다.비율은 숫자 표현을 거스릅니다. 때로는 그런 간단한 일이 사람의 마음을 사로잡을 수 있습니다(좋아합니다).

다행스럽게도 전체 언어와 라이브러리는 표기법 개념을 사용하여 정밀 삼각 함수 전용으로 사용할 수 있습니다(다음에서 설명하는 것과 유사). 라세 V.칼센 ).

기계가 이해할 수 있는 형식으로 e 및 pi와 같은 개념을 설명하는 라이브러리/언어를 생각해 보세요.기계는 완벽한 원이 무엇인지에 대한 개념을 갖고 있습니까?아마도 아닐 수도 있지만, 우리는 우리가 알고 있는 모든 특성(일정한 반경, 원주에 대한 반경의 관계는 2*pi*r = C)을 충족하는 객체, 즉 원을 만들 수 있습니다.pi와 같은 객체는 앞서 언급한 비율로만 설명됩니다.r & C는 원하는 정밀도로 설명되는 숫자 객체일 수 있습니다.e는 "e는 x = 0 지점에서 함수 f(x) = ex의 도함수(접선의 기울기) 값이 정확히 1이 되는 고유한 실수이기 때문에" 정의될 수 있습니다. 위키피디아.

재미있는 질문입니다.

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