Потеря точности с очень маленькими числами в массивах Python - PullRequest
5 голосов
/ 23 сентября 2011

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

X = zeros((2,2))
Y = zeros((2,2))
Z = X            #a shorter way of making a new matrix, equal to X...
X[0,0] = Y[0,0]
Z[0,0]=0
print Y[0,0]
print X[0,0]
print type(Y[0,0])
print type(X[0,0])
if X[0,0]==Y[0,0]:
   print'they are equal'
else:
   print'they are NOT equal'

Я запустил этот маленький фрагмент кода для всех коэффициентов, и все выходные данные похожи на это:

1.90897e-14
0
<type 'numpy.float64'>
<type 'numpy.float64'>
they are NOT equal

Мне кажется, что массив X относится к другому типу, но он создается таким же образом с помощью функции нулей () со стандартным типом (float64)

Редактировать: массивы инициализируются с

X = zeros((2,2), dtype=float64)
Y = zeros((2,2), dtype=float64)

Также включен дополнительный полезный отпечаток в приведенном выше примере.

Редактировать: добавлены проблемные строки, после того как я нашел проблему

1 Ответ

3 голосов
/ 23 сентября 2011

Вы абсолютно уверены , что X является массивом float64? Если бы это было так, я бы ожидал, что X [0,0] будет 0,0, но вместо этого вы увидите 0, что выглядит как целое число ...

>>> Xf = arange(10,dtype=float64)
>>> Xi = arange(10)
>>> Xf[0]
0.0
>>> Xi[0]
0
>>> Yf = Xf*0.0
>>> Yf[0]
0.0
>>> 
>>> Yf[0] = 1.90897e-14
>>> Yf[0]
1.9089700000000001e-14
>>> Xf[0] = Yf[0]
>>> Xf[0]
1.9089700000000001e-14
>>> Xi[0] = Yf[0]
>>> Xi[0]
0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...