преобразование float в long в python - PullRequest
4 голосов
/ 08 сентября 2011

У меня есть функция fac(n), которая возвращает n!, и я сравниваю ее с гаммой (n + 1)

>>> from math import gamma
>>> gamma(101)-fac(100)
0.0
>>> math.floor(gamma(101))-fac(100)
0.0
>>> long(gamma(101))-fac(100)
-1716052534060312817912314997891197522637580074354635372754659484313875350886868191008427848256820699487696649234627144617147818134104040275968L

гамма (101) = 100! и является целым числом.

почему результаты отличаются?

Ответы [ 2 ]

6 голосов
/ 08 сентября 2011

Результаты отличаются из-за ограниченной точности типа с плавающей запятой и из-за способа, которым оператор вычитания приводит свои операнды к одному и тому же типу.Функция gamma возвращает число с плавающей запятой, поэтому она не может вернуть точный ответ для таких больших чисел. Эта страница содержит подробное описание проблем.

В gamma(101)-fac(100) термин fac(100) преобразуется в число с плавающей точкой перед операцией вычитания.

>>> gamma(101)
9.332621544394415e+157
>>> float(fac(100))
9.332621544394415e+157

(Наиболее значимая) часть fac(100), которая помещается в число с плавающей точкой, совпадает с gamma(101), поэтому вычитание дает 0.0.

Для вашего второго теста gamma(101) не имеет дробной части, поэтомуmath.floor не имеет никакого эффекта:

>>> math.floor(gamma(101)) == gamma(101)
True

Когда вы конвертируете gamma(101) в длинную, вы можете ясно увидеть, что она неточна:

>>> long(gamma(101))
933262154439441509656467047959538825784009703731840988
310128895405822272385704312950661130892883272778258496
64006524270554535976289719382852181865895959724032L
>>> fac(100)
933262154439441526816992388562667004907159682643816214
685929638952175999932299156089414639761565182862536979
20827223758251185210916864000000000000000000000000L
2 голосов
/ 08 сентября 2011

Числа с плавающей точкой не имеют бесконечной точности, и преобразование их в long не даст совершенно точных результатов. Разница, которую вы видите, - это разница между представлением с плавающей запятой gamma(101) и его фактическим целочисленным значением.

...