Результаты отличаются из-за ограниченной точности типа с плавающей запятой и из-за способа, которым оператор вычитания приводит свои операнды к одному и тому же типу.Функция 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