Точность, почему Matlab и Python numpy дают такие разные результаты?

Я знаю об основных типах данных и о том, что типы с плавающей запятой (float, double) не могут точно содержать некоторые числа.

Однако при переносе некоторого кода из Matlab в Python (Numpy) я обнаружил некоторые существенные различия в вычислениях, и я думаю, что это возвращается к точности.

Возьмем следующий код, нормализующий по оси z 500-мерный вектор только с первыми двумя элементами, имеющими ненулевое значение.

Matlab:

Z = repmat(0,500,1); Z(1)=3;Z(2)=1;
Za = (Z-repmat(mean(Z),500,1)) ./ repmat(std(Z),500,1);
Za(1)
>>> 21.1694

Python:

from numpy import zeros,mean,std
Z = zeros((500,))
Z[0] = 3
Z[1] = 1
Za = (Z - mean(Z)) / std(Z)
print Za[0]
>>> 21.1905669677

Помимо того, что форматирование показывает немного больше цифр в Python, есть огромная разница (imho), более 0,02

И Python, и Matlab используют 64-битные данные типа (афаик). Python использует numpy.float64 и Matlab double.

Почему разница такая огромная? Какой из них более правильный?

18
задан rocksportrocker 20 September 2011 в 11:56
поделиться