разная точность с плавающей запятой с использованием random на python 2.6 и python 2.7

Почему существует разная точность при использовании Random.random() в Python 2.6 и Python 2.7

пример:

import random
import sys

rng = random.Random(0)

print sys.version
for i in range(10):
    print repr(rng.random())

2.6.6 (r266:84297, 24 августа 2010, 18:46:32) [MSC v.1500 32 бит (Intel)]
0,84442185152504812
0,75795440294030247
0,420571580830845

2.7.5 (по умолчанию, 15 мая 2013 г., 22:43:36) [MSC v.1500 32 бит (Intel)]
0,8444218515250481
0,7579544029403025
0,420571580830845

Почему разная точность? Возможно, это связано с этими изменениями: http://docs.python.org/2/tutorial/floatingpoint.html#representation-error

В версиях до Python 2.7 и Python 3.1 Python округлял это значение до 17 значащих цифр, что давало «0,100000000000000001». В текущих версиях Python отображает значение, основанное на самой короткой десятичной дроби, которая правильно округляется до истинного двоичного значения, в результате чего получается просто «0,1».


person hugo24    schedule 14.10.2013    source источник


Ответы (1)


Числа, возвращаемые random(), совпадают. Отличается точность отображения.

Вот первые два числа, возвращенные моим Python 2.7, но отображаемые со значительно большим количеством десятичных цифр, чем по умолчанию:

$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import random
>>> rng = random.Random(0)
>>> '%.50f' % rng.random() 
'0.84442185152504811718188193481182679533958435058594'
>>> '%.50f' % rng.random() 
'0.75795440294030247407874867349164560437202453613281'

Если вы округлите их до 17 знаков после запятой, вы получите точно такие же числа, как и в Python 2.6.

person NPE    schedule 14.10.2013
comment
Не все так, как должно быть appears ;) - person Aleksander Lidtke; 14.10.2013
comment
Я мог бы округлить это, да, но у меня есть библиотека, которая использует модуль random и в редких случаях получает различное поведение для определенных семян при использовании python 2.6 по сравнению с python 2.7. - person hugo24; 14.10.2013
comment
Думаю поплавки не одинаковые в 2.6 и 2.7. В версии 2.7 были внесены некоторые изменения (вы можете прочитать здесь: docs. python.org/release/2.7/whatsnew/2.7.html это указано прямо вверху). И эти изменения используются в Python 3.x. Python 3.4.0a3: 0,84442185152504811718188193481182679533958435058594 - person hugo24; 15.10.2013
comment
После некоторого тестирования я обнаружил, что моя проблема на самом деле заключалась в том, что я использовал python 2.6 32bit против python 2.7 64bit. Я предполагаю, что поскольку float в python - это float C, который на 64-битной версии имеет более высокую точность. На 32-битной я получаю одинаковое поведение случайного модуля для обеих версий Python. - person hugo24; 16.10.2013