Сохранение числа в переменную

Мне нужно найти наименьшее положительное число (которое не равно 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". Как я могу сохранить необходимые номера без необходимости вручную вводить их из списка, который я получаю из моего кода?

Можете ли вы поделиться тем, что вы получаете после запуска вышеуказанного кода?

Harshit 11.10.2018 08:49

Почему вы ожидаете, что small сделает нет0, если ваше состояние while - while small > 0? Либо small будет <= 0, либо у вас будет бесконечный цикл. Поскольку small никогда не может быть < 0, варианты таковы, что это будет == 0 (на самом деле он будет очень, очень близок к 0, а не 0) или у вас будет бесконечный цикл.

DeepSpace 11.10.2018 08:52

Связанный: stackoverflow.com/questions/588004/…

DeepSpace 11.10.2018 08:54

Кроме того, какой «список» вы имеете в виду? в вашем коде нет списка.

DeepSpace 11.10.2018 08:57

отредактировал мой ответ, предоставил лучшее решение.

Vaibhav Vishal 11.10.2018 09:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
5
175
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
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

Другие вопросы по теме