Ограничение числами с плавающей запятой (не по строкам) - PullRequest
0 голосов
/ 19 октября 2018

Я делаю NN (маленький, который помогает мне учиться), и я хочу добавить самокорректирующийся прирост.Я знаю, что числа с плавающей запятой не точны, но есть ли способ сделать их такими.

Вот мой лучший способ сделать это:

while (T - W) != 0.0:
    W = op
    T = self.learn(list_in, list_out, W, inc)

    if (T-W) < 0:
        if alternate == 0:
            alternate = -1
        elif alternate == 1:
            inc = inc/10
            alternate = -1
    elif (T-W) > 0:
        if alternate == 0:
            alternate = 1
        elif alternate == -1:
            inc = inc/10
            alternate = 1

    op = T

op - раньше облегчал мою жизнь,Я знаю, это выглядит плохо

T - расчетный вес

W - текущий вес

list_in / out - файл, который имитирует желаемые веса (будет публиковать, если вам это нужно)

inc - изначально 0,1

альтернативный - предполагается, что он используется для уменьшения приращения на десятую

, функция должна быть W * x, x - любое целое число, иW (вес) равен 2

Теперь, если мой вес изначально равен 30,0, на следующей итерации он будет равен 29,9, а на следующей итерации он будет равен 29,89999999999987 ... В результате мой NN вычисляет желаемыйвес равен 1.9999999999999885, что не соответствует действительности, и функция возвращает ложные результаты на 4-й итерации.(предполагается, что вход 3 должен возвращать 6, но он возвращает 5)

Я знаю, что плавающая точка 0,1 фактически сохраняется как 0,100000000000000000000123 или что-то в памяти, но есть ли способ, которым я могу «обрезать» ее, памятьчасти "123"?Я попытался округлить 29,899 ... и это работает, но если мой вес не должен быть целым числом, он никогда не пройдет, потому что он может рассчитать только целые числа.(Я сделал еще один тестовый файл со случайным числом W * x, где W - 2.01891564)

Чтобы уточнить: я не хочу распечатывать его и видеть «0.1», я хотел бы как-то убедитьсячто у меня есть только 0,1, без «лишних» битов памяти.Можно ли это сделать, и если нет, какой другой подход я могу попробовать?

1 Ответ

0 голосов
/ 19 октября 2018

Как подсказал @Prune, мне нужен пакет Decimal.Тщательно меняющиеся числа с плавающей точкой в ​​моем коде с помощью десятичных дробей решили мою проблемуЕсли вы хотите сделать десятичное число, обязательно инициализируйте его строкой (т. Е. Decimal('0.1'), а не другим плавающим числом, поскольку в результате будет получено фактическое представление числа в памяти:

k = 0.1
p = Decimal(k)
t = Decimal('0.1')
print(p)
print(t)

0,1000000000000000055511151231257827021181583404541015625 | результат печати p

0,1 | результат печати t

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...