Мне нужно найти наименьшее положительное число (которое не равно 0) и сохранить его в переменной "small", а наибольшее положительное число, которое меньше бесконечности (math.inf), и сохранить его в переменной "great". Мой код выглядит так:
x = float(1)
import math
small = x/2
while small > 0:
small = small/2
print(small)
y = float(1)
great = y*2
while great < math.inf:
great = great*2
print(great)
Он печатает список чисел, но проблема в том, что Python сохраняет "small = 0" и "great = inf". Как я могу сохранить необходимые номера без необходимости вручную вводить их из списка, который я получаю из моего кода?
Почему вы ожидаете, что small сделает нет0, если ваше состояние while - while small > 0? Либо small будет <= 0, либо у вас будет бесконечный цикл. Поскольку small никогда не может быть < 0, варианты таковы, что это будет == 0 (на самом деле он будет очень, очень близок к 0, а не 0) или у вас будет бесконечный цикл.
Связанный: stackoverflow.com/questions/588004/…
Кроме того, какой «список» вы имеете в виду? в вашем коде нет списка.
отредактировал мой ответ, предоставил лучшее решение.






x = float(1)
small = x
while small > 0:
real_small = small
small = small/2
print(small) # 0.0
print(real_small) # 5e-324
Это даст вам минимально возможное (почти) плавучесть. Надеюсь, теперь вы тоже сможете вычислить самый крупный.
Лучшее и простое решение для поиска наименьшего и наибольшего возможного числа с плавающей запятой:
import numpy as np
import math
>>> # Smallest
>>> np.nextafter(0, 1)
5e-324
>>> # Largest
>>> np.nextafter(math.inf, 0)
1.7976931348623157e+308
>>> np.nextafter(np.float64(math.inf), 0)
1.7976931348623157e+308
Другое решение - использование sys.float_info:
>>> import sys
>>> sys.float_info
sys.float_info(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.220446049250313e-16, radix=2, rounds=1)
Все методы предоставляют одинаковое максимальное значение, но для минимального значения sys.float_info предоставляет другое значение, чем другие, я не уверен, почему, может быть, кто-то еще может просветить меня по этому поводу.
nextafter (х, у)источник
Функции nextafter (), nextafterf () и nextafterl () возвращают
следующее представимое значение с плавающей запятой после x в направлении
из y.
Если y меньше x, эти функции вернут наибольшее значение. представимое число меньше x.
Если x равно y, функции возвращают y.
numpy.nextafter (x1, x2, /, out = None, *, где = True, casting = 'same_kind', order = 'K', dtype = None, subok = True [, signature, extobj]) = <ufunc ' nextafter '>источник
Поэлементно возвращает следующее значение с плавающей запятой после x1 по направлению к x2.
Вы должны прервать первый цикл до того, как small станет 0, а второй цикл перед great будет равен бесконечности:
import math
small = 1
while True:
if small / 2 == 0:
print(small)
break
small /= 2
great = float(1)
while True:
if great * 2 == math.inf:
print(great)
break
great *= 2
Это выводит:
5e-324
8.98846567431158e+307
Можете ли вы поделиться тем, что вы получаете после запуска вышеуказанного кода?