오늘부터 GNU Octave를 배우기 시작했고, 매뉴얼에 나와 있는 첫 번째 표현을 시도해 보았습니다.
exp(i*pi)
결과는
ans = -1.0000e+000 + 1.2246e-016i
그리고 GNU Scientific Library도 비슷한 결과를 제공하는 것 같습니다.
그렇다면 이것은 Octave 버그입니까, 아니면 수치 분석 소프트웨어의 일반적인 문제입니까(기호 평가 소프트웨어는 확실히 정확한 답을 제공할 것입니다)?
답변1
이는 둘 중 하나의 버그가 아니지만 컴퓨터가 부동 소수점 연산을 수행하는 방식 때문입니다. 모든 컴퓨터가 작동할 수 있는 정밀도에는 제한이 있으므로 때때로 이와 같은 예외 현상을 볼 수 있습니다. 이를 처리할 수 있는 소프트웨어를 작성하는 것이 가능하지만 계산 시간이 훨씬 더 많이 걸리고 메모리 요구 사항이 크게 늘어납니다.
살펴보면 e^(i*pi)는 -1 + 1.2x10^-16i를 반환합니다. 보시다시피, 허수 구성요소는 매우 작습니다(실수 구성요소보다 16배 더 작기 때문에 대부분은 무시할 수 있다고 간주합니다). 이 구성 요소는 계산 자체뿐만 아니라 저장된 pi 값이 비합리적이기 때문에 반올림 및 정밀도 오류로 인해 발생합니다(참조이 링크무리수를 다루는 또 다른 예를 보려면)
이 계산 오류가 허용되지 않는 경우 수치 분석보다는 기호 분석을 수행하는 수학 패키지나 다음을 사용하는 수학 패키지를 조사해야 합니다.고정밀 부동 소수점 숫자. 주의할 점은 메모리 요구 사항이 대폭 증가하고 기호 분석이 훨씬 느려지는 경우가 많다는 것입니다. 또한 정밀도가 높은 숫자는 반올림/정밀도 오류의 크기를 줄여줍니다.~ 아니다그들을 제거하십시오.