exp (i * pi) 표현식이 GNU Octave에서 잘못된 결과를 반환하는 이유는 무엇입니까?


8

나는 오늘 GNU Octave를 배우기 시작했고 매뉴얼에 주어진 첫 번째 표현을 시도했습니다.

exp(i*pi)

결과는

ans = -1.0000e+000 + 1.2246e-016i

그리고 GNU Scientific Library도 비슷한 결과를 제공합니다.

이것이 옥타브 버그입니까, 아니면 수치 분석 소프트웨어의 일반적인 문제입니까?


2
옥타브는 수치 분석을 목적으로합니다. Mathematica는 확실히 당신에게 더 나은 대답을 줄 것입니다 ... : P 그냥 농담 ... GNU 상징 분석 솔루션을 찾아보십시오
gd1

@Giacomo : 알고 있습니다. 모든 수치 분석 소프트웨어가 그러한 숫자 또는 GNU 옥타브로 평가되는지 궁금합니다.
Siyuan Ren

@Karsus Ren 이것은 실제로 소프트웨어 버그가 아니라 하드웨어 버그입니다. 단일 숫자의 저장 공간이 제한된 하드웨어에서 비합리적인 숫자로 표현을 평가하는 것은 본질적인 한계입니다.
획기적인

답변:


8

이것은 버그도 아니지만 컴퓨터가 부동 소수점 연산을 수행하는 방식으로 인해 발생합니다. 모든 컴퓨터에서 사용할 수있는 정밀도는 제한되어 있으므로 때때로 이와 같은 예외가 나타날 수 있습니다. 이를 처리 할 수있는 소프트웨어를 작성할 수는 있지만 계산 시간이 훨씬 많이 걸리고 메모리 요구 사항이 크게 증가합니다.

이를 보면 e ^ (i * pi)는 -1 + 1.2x10 ^ -16i를 반환합니다. 보시다시피, 가상의 구성 요소는 매우 작습니다 (실제 부분보다 16 배 더 작기 때문에 무시할 만하다고 생각합니다). 이 구성 요소는 계산 자체와 비합리적이므로 pi의 저장된 값과 함께 반올림 및 정밀 오차로 인해 도입됩니다 ( 이성적 수치를 다루는 다른 예는 이 링크 참조 ).

이 계산 오류를 받아 들일 수없는 경우 수치 분석보다는 기호 분석을 수행하는 수학 패키지 또는 고정밀 부동 소수점 숫자 를 사용하는 수학 패키지를 살펴보십시오 . 이것의 주의점은 메모리 요구 사항을 크게 증가시키고 기호 분석이 훨씬 느리다는 것입니다. 또한 정밀도가 높을수록 반올림 / 정밀도 오류의 크기가 줄어들고 제거 되지 않습니다 .


1
이것이 수치 분석 소프트웨어의 일반적인 행동이라는 확인이 필요합니다.
Siyuan Ren

@Karsus Ren 그것은 실제로 충분히 높은 정밀도를 가진 이런 종류의 소프트웨어의 행동입니다 . 반 직관적 인 것처럼 보이지만 정밀도가 낮을수록 이러한 이상 현상이 자주 발생하지는 않습니다. 자세한 내용은 Microsoft의이 기사 를 참조하십시오. 그러나이 문제는 소스 코드와 컴파일러 / 대상 아키텍처의 조합입니다. 또한 이 Wikipedia 기사 에는 문제에 대한 좋은 배경 정보가 있습니다.
획기적인

1
근본적인 문제는 Octave의 상수 pi가 수학 상수 π가 아니라 그것에 가까운 부동 소수점 근사치라는 것입니다. 이 exp함수는 또 다른 작은 오류를 추가합니다. 기호식으로 작동하는 시스템은 exp(i*pi)정확하게 계산할 수 있습니다. 옥타브는 그런 시스템이 아닙니다.
키이스 톰슨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.