Поплавковая арифметика - PullRequest
       6

Поплавковая арифметика

0 голосов
/ 21 ноября 2011

Я пишу программу, которая использует простой алгоритм восприятия нейронной сети, у меня проблема с выполнением отрицательной арифметики с плавающей точкой, когда я делаю это

summ = x1*w1+x2*w2-t

сумма получает значение -2.77555756156e-17

это происходит только тогда, когда x1 = 1.0 w1 = 0.2 x2 = 0.0 w2 = 0.1 t=0.2 Если я делаю это в консоли Python, все в порядке, но в программе это странное значение.Я на самом деле печатаю каждое значение, и все они нормальные, но сумма сходит с ума.

вот полный код http://tinypaste.com/1b8f9dd6, вычисление выполняется сверху, в первой функции.

Кстати, я использую Python 2.7, я запутался, как ад

Ответы [ 3 ]

3 голосов
/ 21 ноября 2011

Число -2.77555756156e-17 равно -0.0000000000000000277555756156, что, как вы можете сказать, приблизительно равно 0. Очевидно, вы ожидаете точно ноль, но арифметика с плавающей запятой не является точной для большинства чисел. Вот так работает математика в компьютерах.

Конечно, если вы введете 1.0 * 0.2 + 0.0 * 0.1 - 0.2, вы получите правильный ответ, но ваша программа выполняет вычисления 1 * 0.19999999999999998 + 1 * 0 - 0.20000000000000001.

3 голосов
/ 21 ноября 2011

С Гид с плавающей точкой :

Почему мои цифры, такие как 0,1 + 0,2, не складываются в хороший раунд 0,3, и вместо этого я получаю странный результат, такой как 0.30000000000000004?

Поскольку внутренне компьютеры используют формат (двоичная с плавающей запятой) это не может точно представлять число как 0.1, 0.2 или 0.3 вообще.

Когда код скомпилирован или интерпретирован, ваш «0.1» уже округляется до ближайшего числа в этом формате, что приводит к небольшому ошибка округления еще до того, как произойдет расчет.

2 голосов
/ 21 ноября 2011

Программа Python не будет давать ответы, отличные от ответов, полученных на консоли, при условии, что одни и те же вычисления выполняются для одних и тех же входных данных.

Поэтому я думаю, что если вы внимательно проверите, вы увидите, что значения, используемые в программе, немного отличаются от значений, используемых в консоли. С числами, которые вы даете, вычисление действительно вернет точно ноль, так что я думаю, вы обнаружите, что числа, используемые в программе, не совсем то, что вы считаете, что они.

Все равно с плавающей точкой не точно. Это точно только до конечной точности. Как только вы начнете выполнять арифметику, вы должны делать сравнения с заданным допуском, а не с точным. Для проверки на ноль вы должны убедиться, что абсолютное значение результата меньше некоторого небольшого значения по вашему выбору.

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