Какой диапазон значений может иметь float в Python?

Легко с итераторами.

>>> a = [0,1,2]
>>> b = [item for item in range(10)]
>>> b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a
[0, 1, 2]
>>> [False, True][set([item in b for item in a]) == set([True])]
True
>>> a = [11, 12, 13]
>>> [False, True][set([item in b for item in a]) == set([True])]
False
29
задан mskfisher 11 May 2012 в 15:02
поделиться

6 ответов

См. сообщение .

Соответствующие части поста:

In [2]: import kinds 
In [3]: kinds.default_float_kind.M 
kinds.default_float_kind.MAX         kinds.default_float_kind.MIN 
kinds.default_float_kind.MAX_10_EXP  kinds.default_float_kind.MIN_10_EXP 
kinds.default_float_kind.MAX_EXP     kinds.default_float_kind.MIN_EXP 
In [3]: kinds.default_float_kind.MIN 
Out[3]: 2.2250738585072014e-308 
13
ответ дан Juha Syrjälä 11 May 2012 в 15:02
поделиться
>>> import sys
>>> sys.float_info
sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308,
min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53,
epsilon=2.2204460492503131e-16, radix=2, rounds=1)

Наименьшее - sys.float_info.min (2.2250738585072014e-308), а самое большое - sys.float_info.max (1.7976931348623157e + 308). См. документацию для других свойств.

sys.float_info.min - нормализованный мин. Обычно вы можете получить денормализованный минимум как sys.float_info.min * sys.float_info.epsilon. Обратите внимание, что такие числа представлены с потерей точности. Как и ожидалось, денормализованный минимум меньше нормализованного минимума.

64
ответ дан A-B-B 11 May 2012 в 15:02
поделиться

В качестве своего рода теоретического дополнения к предыдущим ответам я хотел бы отметить, что «магическое» значение ± 308 происходит непосредственно из двоичного представления чисел с плавающей точкой. Число с плавающей запятой двойной точности имеет форму ± c * 2 ** q с «малым» дробным значением c (~ 1), а q - целое число, записанное с 11 двоичными цифрами (включая 1 бит для знака) , Тот факт, что 2 ** (2 ** 10-1) имеет 308 (десятичных) цифр, объясняет появление 10 ** ± 308 в крайних значениях с плавающей запятой.

Расчет в Python:

>>> print len(repr(2**(2**10-1)).rstrip('L'))
308
8
ответ дан Eric O Lebigot 11 May 2012 в 15:02
поделиться

Python использует поплавки двойной точности, которые могут хранить значения от 10 до -308 до 10 до 308.

http://en.wikipedia.org/wiki/Double_precision_floating-point_format

Попробуйте этот эксперимент из подсказки Python:

>>> 1e308
1e+308
>>> 1e309
inf

10 до 309 мощность переполнена, а 10 к 38 нет. И требовалось доказать.

На самом деле, вы, вероятно, можете получить числа меньше 1e-308 через денормали , но это значительно сказывается на производительности. Я обнаружил, что Python может обрабатывать 1e-324, но теряет значение на 1e-325 и возвращает 0.0 в качестве значения.

4
ответ дан steveha 11 May 2012 в 15:02
поделиться

Просто играть; Вот алгоритмический метод для нахождения минимального и максимального положительного числа с плавающей точкой, мы надеемся, что в любой реализации на Python, где float("+inf") приемлемо:

def find_float_limits():
    """Return a tuple of min, max positive numbers
    representable by the platform's float"""

    # first, make sure a float's a float
    if 1.0/10*10 == 10.0:
        raise RuntimeError("Your platform's floats aren't")

    minimum= maximum= 1.0
    infinity= float("+inf")

    # first find minimum
    last_minimum= 2*minimum
    while last_minimum > minimum > 0:
        last_minimum= minimum
        minimum*= 0.5

    # now find maximum
    operands= []
    while maximum < infinity:
        operands.append(maximum)
        try:
            maximum*= 2
        except OverflowError:
            break
    last_maximum= maximum= 0
    while operands and maximum < infinity:
        last_maximum= maximum
        maximum+= operands.pop()

    return last_minimum, last_maximum

if __name__ == "__main__":
    print (find_float_limits()) # python 2 and 3 friendly

В моем случае

$ python so1835787.py
(4.9406564584124654e-324, 1.7976931348623157e+308)

, так что денормали используются.

3
ответ дан tzot 11 May 2012 в 15:02
поделиться

Технически говоря, наименьшее число с плавающей запятой равно -inf, а максимальное число с плавающей запятой inf:

>>> (float('-inf')            #   negative infinity 
< -1.7976931348623157e+308    #*  smallest float that is not negative infinity 
< -4.9406564584124654e-324    #*  biggest negative float that is not zero
< 0                           #   zero duh
< 4.9406564584124654e-324     #*  smallest positive float that is not zero
< 1.7976931348623157e+308     #*  biggest float that is not positive infinity
< float('inf'))               #   positive infinity
True

числа с * зависят от машины и зависят от реализации.

1
ответ дан Benoît Pilatte 11 May 2012 в 15:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: