Каковы его наименьшие и самые большие значения в python?
Каков диапазон значений, которые может иметь float в Python?
Ответ 1
Смотрите post.
Соответствующие части сообщения:
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
Ответ 2
>>> 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
. Обратите внимание, что такие числа представлены с потерей точности. Как и ожидалось, денормализованный мин меньше нормированного мин.
Ответ 3
Как своего рода теоретическое дополнение к предыдущим ответам, я хотел бы упомянуть, что "магическое" значение ± 308 происходит непосредственно из двоичного представления поплавков. Двумерные прецизионные поплавки имеют вид ± c * 2 ** q с "малым" дробным значением c (~ 1) и q an целое число, написанное с 11 двоичными цифрами (включая 1 бит для его знака). Тот факт, что 2 ** (2 ** 10-1) имеет 308 (десятичные) цифры, объясняет появление 10 ** ± 308 в экстремальных значениях плавания.
Расчет в Python:
>>> print len(repr(2**(2**10-1)).rstrip('L'))
308
Ответ 4
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 нет. Что и требовалось доказать.
На самом деле, вы, вероятно, можете получить числа меньше 1е-308 через denormals, но есть значительный успех в этом. Я обнаружил, что Python способен обрабатывать 1e-324
, но переполняется на 1e-325
и возвращает 0.0
в качестве значения.
Ответ 5
Просто поиграть; вот алгоритмический метод для поиска минимального и максимального положительного поплавка, надеюсь, в любой реализации python, где float("+inf")
является приемлемым:
def find_float_limits():
"""Return a tuple of min, max positive numbers
representable by the platform float"""
# first, make sure a float a float
if 1.0/10*10 == 10.0:
raise RuntimeError("Your platform 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)
поэтому используются денормалы.
Ответ 6
С технической точки зрения, самый маленький поплавок -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
числа с *
зависят от машины и от реализации.