2010-09-24 3 views
6

Рассмотрим этот Python код:Упаковка на Python?

assert(a > 0) 
assert(b > 0) 
assert(a + b > 0) 

Может третий утверждают, когда-либо потерпеть неудачу? В C/C++ он может, если сумма переполняет максимальное целочисленное значение. Как это обрабатывается в Python?

+5

Предположим, что a и b не являются классами с переопределенными операторами: P – Colin

ответ

9

Зависит от того, какую версию Python вы используете.

До 2.2 или около того вы можете получить OverflowError.

Версия 2.2-2.7 рекламирует сумму до long (произвольная точность), если она слишком велика, чтобы соответствовать int.

3.0+ имеет только один целочисленный тип, который является произвольной точностью.

3

Python автоматически продвигает целые числа до произвольной точности. Если поплавок становится слишком большим, это будет inf. Таким образом, это было бы неудачно только в том случае, если a и b являются общими и у вас заканчивается память.

1

Если a + b это будет больше, чем максимальное значение целого числа, то результат будет долгим:

>>> import sys 
>>> sys.maxint 
9223372036854775807 
>>> a = sys.maxint 
>>> b = 1 
>>> a + b 
9223372036854775808L # A long 
>>> assert a > 0 
>>> assert b > 0 
>>> assert a + b > 0 
+1

Является ли это длинным или нет, не имеет значения, пройдет ли утверждение. – Zimm3r

-1

Ok ответ на ваш вопрос, как правило, нет, однако, если вы имеете дело с большим числом вы можете иметь некоторые Ниже приведены подробные сведения о больших числах python.

Также смотрите эту запись, содержащую информацию о Inf (бесконечность) NaN (не число (то есть бесконечность/бесконечность = NaN))

Пожалуйста, обратите внимание: Это на 32 битной машине AMD (Хотя питон говорит это intel (это значит, что это 32 бит?)

Python 2.6.2 (r262: 71605, 14 апреля 2009, 22:40:02) [MSC v.1500 32 бит (Intel)] on win32

Максимальное количество CPython в его математическом модуле (ниже C lib), где в противном случае оно будет переполняться o R Возврат инф является 8.2184074615549724e + 309

>>> x = 8.2184074615549724e+309 
>>> x 
8.2184074615549724e+309 
>>> x + 1 
>>> x 
inf 
>>> x = exp(710) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OverflowError: math range error 

Максимальное количество (питон может представлять) является 1.7976931348623157e + 308 и может быть получен путем (возможно также другими способами)

http://docs.scipy.org/doc/numpy/reference/generated/numpy.finfo.html

>>> import numpy 
>>> f = numpy.finfo(float() 
>>> f.max 
1.7976931348623157e+308 

>>> m = f.max 
>>> m1 = m + 100 # supposedly increase the number by 100 
>>> m 
1.7976931348623157e+308 
>>> m1 
1.7976931348623157e+308 
>>> # note how m1 and m are the same number 
>>> m == m1 
True 
>>> 

Я верю (но не знаю), что это связано с использованием математикой базовой библиотеки C http://docs.python.org/library/math.html

Специфично для CPython Математический модуль состоит в основном из тонких оберток вокруг платформы C математическими функциями. Поведение в исключительных случаях следует Приложение F стандарта C99, где подходит. В настоящее время реализация повысит ValueError для недействительных операций, как SQRT (-1,0) или журнал (0,0) (где C99 Приложение F рекомендует сигнализации недопустимую операцию или деления на ноль), и OverflowError результатов, что переполнения (для например, ехр (1000,0))

Изменено в версии 2.6: поведение в особых случаях в настоящее время стремится следовать C99 Приложение F. в более ранних версиях Python поведение в особых случаях было свободно specified.loosely указано ,

Максимальное целое число Python (тип int) определяется sys.maxint. Разница между максимальным целым числом и максимальным числом это

>>> type(x) 
<type 'float'> 
>>> int_x = int(x) 
>>> type(int_x) 
<type 'long'> 
>>> 

Максимальное число первоначально поплавок, но когда мы пытаемся преобразовать его в целое число, используя междунар() он автоматически преобразуется к типу долго, потому что это над sys.maxintloosely указано.

+0

Кто бы ни проголосовал за меня, есть причина? Что-то я могу исправить или узнать? – Zimm3r

+1

Я тебя не проголосовал. Однако ваш ответ является неопределенным и, возможно, неверным. Python имеет по существу те же пределы для 'float' (эквивалент C-типа' double'). –

+0

@Matthew Flaschen Спасибо за отзыв, я попытаюсь добавить некоторые детали. – Zimm3r