2014-04-30 2 views
0

저는 matlab에서 C++ 함수로 스크립트를 복사하고 있습니다. 그러나 나는 exp 함수에 대해 다른 결과를 얻는다. std :: exp는 복소수에 대한 MATLAB exp와 다른 결과를 제공합니다

std::complex<double> final_b = std::exp(std::complex<double>(0, 1 * pi)); 

는 MATLAB 코드

final_b = exp(1i * pi); 

에 해당해야하지만이되지 않습니다 : 예를 들어, 조각 다음과 같습니다. MATLAB의 경우 -1 + 0i (올바른 값)를 받고 C++의 경우 -1 + -2.068231e-013 * i를 얻습니다.

이제 처음에는 일종의 반올림 오류라고 생각했지만 더 큰 지수를 가진 실제 스크립트에서는 전혀 다른 숫자를 얻었습니다. 이것의 원인은 무엇입니까? 이 문제를 어떻게 해결할 수 있습니까?

편집 : 내가 수동으로 오일러 공식

exp(x+iy) = exp(x) * (cos(y) + i*sin(y)) 

와 C에서 같은 불안정한 결과를 얻을 ++

+2

당신이 질문의 내용으로 판단 40two @ 소수점 정밀도 – 101010

+1

부동 용어에 대해 잘 알고 있습니까를, 나는 대답은 '예라고 생각 –

+2

단지. 아이디어, 파이의 정밀도를 확인 했습니까? –

답변

0

이라고 부동 소수점 근사치 (또는 부정확)와 지수를 계산 시도했다 :

헤더를 포함하는 경우 cfloat 몇 가지 정의가 있습니다. 특히, DBL_EPSILON, 일반적으로 1e-9 가장 작은 숫자가 1.0 + DBL_EPSILON != 1.0는 (그리고 -2.068231e-013는보다 훨씬 작하는 당신이 다음 코드 조각을 할 경우 0 또는없는 경우, 당신은 확인할 수 있습니다.

?
// The complete formula is std::abs(a - b), but since b is zero, I am ommiting it 
if (std::abs(number.imag()) < DBL_EPSILON) { 
    // The number is either zero or very close to zero 
} 

예를 들어, 당신은 여기에 작업 코드를 볼 수 있습니다 http://ideone.com/2OzNZm

+2

세부 정보 : DBL_EPSILON은 내 float.h에 2.2204460492503131e-016입니다. Idem in Matlab ... 아마 당신은 FLT_EPSILON과 혼동을 일으킬 것입니다. 이것은 보통 1.192092896e-07 정도입니다. 그 작은 세부 사항 옆에, 그것은 좋은 설명입니다. – Bentoy13

+0

숫자가 DBL_EPSILON보다 작은 지 확인한 다음 0으로 반올림하면 충분합니까? – spurra

+0

@ Bentoy13 올바른, 그 값은 libc 구현에 따라 다르며 컴파일러 플래그에 따라 달라질 수 있습니다. –

관련 문제