różnice precyzji w matlab i c ++

Próbuję wykonać testy równoważności algorytmu napisanego w C ++ i Matlab. Algorytm zawiera pewien rodzaj pętli w czasie i działa ponad 1000 razy. Ma operacje arytmetyczne i niektóre funkcje matematyczne.

Dostarczam początkowe dane wejściowe do obu platform ręcznie (jak a = 1.767, b = 6.65, ...) i kiedy sprawdzam szesnastkowe reprezentacje tych wejść, są one takie same. Więc nie ma problemu dla wejść. I uzyskaj wyjścia c ++ do matlab za pomocą pliku tekstowego z 16 cyframi dziesiętnymi. (Używam instrukcji „setprecision (32)”)

Ale tu pojawia się problem; chociaż po 614-tym kroku obu kodów wszystkie wyniki są dokładnie takie same, na etapie 615 dostaję różnicę o 2.xxx..xxe-19? A po tym kroku błąd staje się coraz większy i na końcu przebiegów wynosi około 5.xx..xxe-14.

0x3ff1 3e42 a211 6cca ---> [funkcja C ++] ---> 0x3ff4 7619 7005 5a42

0x3ff1 3e42 a211 6cca ---> [funkcja MATLAB] ---> ans

ans - 0x3ff4 7619 7005 5a42

= 2.xxx..xxe-19

Szukałem, jak matlab zachowuje się w liczbach i znalazłem naprawdę interesujące rzeczy, takie jak „denormalizowana mantysa”. Podczas gdy realmin dotyczy e-308, przez denormalizację mantysy matlab ma najmniejszą liczbę rzeczywistą około e-324. Dalej matlab zawiera o wiele więcej cyfr dla „pi” lub „exp (1)” niż c ++.

Z drugiej strony, pomoc matlab mówi, że niezależnie od formatu, jaki wyświetla, matlab używa podwójnej precyzji wewnętrznie.

Naprawdę doceniłbym, gdyby ktoś wyjaśnił, jaki jest dokładny powód tych różnic? Jak możemy przeprowadzić testy równoważności na matlab i c ++?

questionAnswers(3)

yourAnswerToTheQuestion