2016-08-30 7 views
2

Я новичок в Python и я попытался это:Списки в Python последнего элемента

import numpy as np 

x = np.arange(0.7,1.3,0.1) 
print (x) 
y = np.arange(0.6,1.3,0.1) 
print (y) 

Выход был [ 0.7 0.8 0.9 1. 1.1 1.2 1.3] и [ 0.6 0.7 0.8 0.9 1. 1.1 1.2]. Почему в первом случае 1,3 появляется в списке, а во втором случае это не так?

ответ

6

Это связано с rounding errors. Если вы на самом деле распечатать последний элемент в x в его полной точности, вы увидите, что это меньше, чем 1.3:

>>> import numpy as np 
>>> x = np.arange(0.7,1.3,0.1) 
>>> 1.3 > x[-1] 
True 
>>> x[-1] 
1.2999999999999998 

Обратите внимание, как указано в documentation

При использовании не- целочисленный шаг, такой как 0,1, результаты часто не будут согласованы. Лучше использовать linspace для этих случаев .:

+1

Хотя округление может быть проблемой, я думаю, что ссылка на документацию лучше ответить, потому что почему в первом примере не возникала такая же проблема округления? – kosa

+1

@Nambari - Да, если вы не гуру IEEE 754 (которого я не знаю), трудно точно предсказать, как ошибка округления будет беспорядочна с вами, поэтому я добавил ссылку на документы и соответствующий комментарий к моему ответу. – mgilson

1

Смотрите документацию numpy.arange here:

специфический «При использовании нецелого шага, например, 0,1, результаты часто не . быть последовательным лучше использовать linspace для этих случаев»

4

arange не подходит для чисел с плавающей точкой:

При использовании нецелого шага, такого как 0,1, результаты часто не будут согласованы. Для этих случаев лучше use linspace.

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

Смежные вопросы