2012-07-12 8 views
0

누군가가 C++과 matlab에서 같은 부동 소수점 계산 구현을 사용하는지 알려 줄 수 있습니까? C++에서 Matlab과 동일한 값을 얻을 수 있습니까? 차이 무엇인가하지 않으면C++ 및 matlab 부동 소수점 계산

Matlab: R = 1.0000000001623, I = -3.07178893432791e-010, C = -3.79693498864242e-011 

C++: R = 1.00000000340128 I = -3.96890964537988e-009 Z = 2.66864907949582e-009 

나는 포인트 계산 구현을 떠에 대한 자세한 내용을 어디에서 찾을 수 있습니다

현재 나는이 C++로 내 MATLAB 코드를 번역에서 차이가 있나요?

감사합니다.

+0

부동 소수점은 프로세서가 아닌 언어에 기반한 것으로 생각되지만 응답 상자에는이 값을 적을만큼 확실하지 않습니다. –

+10

부동 소수점 계산과의 일관성을 기대하지 마십시오. 동일한 CPU 명령어가 사용되는 경우에도 순서 만 변경해도 다른 결과를 제공 할 수 있습니다. –

+4

유용한 결과를 이끌어 내려면 결과 만이 아닌 일부 코드를 보여줘야 할 수도 있습니다. –

답변

1

숫자가 실제로 무엇인지 명확하지 않지만 첫 번째 (최대) 숫자의 상대적인 차이는 약 1e-8이며 이는 많은 배정도 알고리즘의 상대 허용 오차입니다.

부동 소수점 숫자는 실수 시스템의 근사치이며 유한 크기 (배정 밀도의 경우 64 비트)는 정밀도를 제한합니다. 이 유한 정밀도 때문에 부동 소수점 숫자가 포함 된 연산은 반올림 오류가 발생할 수 있으므로 엄격하게 연관되지는 않습니다. 이것이 의미하는 것은 A + (B + C)! = (A + B) + C입니다. 이 둘의 차이는 대개 상대 크기에 따라 작지만 항상 0은 아닙니다.

이 의미는 Matlab로 코딩 된 알고리즘과 C++에서 코딩 된 알고리즘을 비교할 때 상대적인 절대 값에 작은 차이가있을 것을 기대해야한다는 것입니다. 차이점은 라이브러리에있을 수 있습니다 (즉, Matlab이 sqrt과 같은 루틴에 대해 시스템 수학 라이브러리를 사용한다는 보장이 없음). 또는 C++ 및 Matlab 구현에서 해당 연산을 다르게 정렬 할 수 있습니다.

Boost :: Test의 floating point comparison tests 섹션에서이 부분을 설명하고 좋은 참고 자료가 있습니다. 특히 What Every Computer Scientist Should Know About Floating-Point Arithmetic을 읽고 Knuth의 TAOCP Vol. II 사본을 가져 오는 것이 좋습니다.

0

Matlab은 기본적으로 이중 부동 소수점 정밀도를 사용하며 C 부동 소수점은 단일 부동 소수점 정밀도를 사용합니다.

부동 소수점에 대한 표현은 둘 사이에서 동일하며 프로세서이거나 표준이라고 생각합니다. 그러나 언급 한 바와 같이 부동 소수점은 매우 변덕 스럽습니다. 항상 약간의 허용 오차를 허용해야합니다. 아래처럼 복잡한 연산을 수행하면 대수가 다르게 말해도 0이 아닌 숫자를 자주 얻게됩니다. 작업이 matlab 및 c와 함께 수행되는 방법 사이의 두건 아래에있는 것들은 약간의 차이를 허용 할 것입니다. 그들이 가까이 있는지 확인하십시오.

((3*pi+2)*5-9)/2-7.5*pi-3