Несовершенство деления с плавающей точкой

0

Я знаю, что плавающая точка не идеальна, либо она float либо double, но означает ли это, что когда я делю одно число с плавающей запятой на другое, и дивиденд делится делителем без напоминания (например, 10000.0 делится на 10.0), возможно ли, что я получаю номер с.99999999... в конце, который меньше, чем правильный результат крошечной фракцией. Может ли такое произойти с плавающей точкой?

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

  • 2
    Да, это возможно, прочитайте [Что должен знать каждый учёный-компьютерщик об арифметике с плавающей точкой] [1]. [1]: docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
  • 1
    Следуя стандарту C / C ++, это будет поведение, определяемое реализацией. По IEEE, если результат будет точным, он будет точным. т.е. 1000 / 10 никогда не даст 99.9999999
Показать ещё 7 комментариев
Теги:
floating-point
division

2 ответа

7
Лучший ответ

означает ли это, что когда я делю одно число с плавающей запятой на другое, и дивиденд делится делителем без напоминания (например, 10000.0 делится на 10.0), возможно, что я получаю номер с.99999999... при конец

Нет. Разделение IEEE 754 правильно округлено. Если в результате будет представлен число с плавающей запятой (1000 в вашем примере), это результат, который вы получите для деления.

Что может случиться, так это то, что вы не делите числа, о которых вы думаете, потому что вы написали 0.1 и вы думаете, что это представляет математическое значение 0.1. В этом случае конечный результат может быть неожиданным, но это не ошибка деления с плавающей запятой.

До тех пор, пока вы знаете, что вы делите числа, которые вы имеете в виду, если математический результат деления есть, скажем, целое число ниже 2 24 то результатом деления с плавающей запятой будет это целое число.

  • 0
    Поэтому независимо от того, насколько велики или малы числа, поскольку они представляют собой натуральные числа без дробной части и одно делится на другое, я не получаю дробной части в результирующем числе после деления на любом ЦП при компиляции с GCC / MVC ?
  • 0
    Нет, только если все три числа, два входа и результат точно представимы.
Показать ещё 1 комментарий
2

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

Прежде всего, форматы имеют конечный диапазон. Естественных чисел нет. Однако даже 32-битный двоичный предел с плавающей запятой, около 10 ^ 38, достаточно велик для большинства практических целей.

В пределах этого диапазона сводится к тому, что натуральное число может быть выражено как 1.x*2^n где n - целое число, а 1.x - двоичная дробь с не более чем 23 битами после двоичной точки. Все натуральные числа, которые соответствуют 24 битам, удовлетворяют этому условию. Так что все силы двух, которые находятся в радиусе действия.

В общем, большие поплавки с большими показателями имеют больший разрыв между последовательными значениями. До 24-битных naturals пробел не больше 1, поэтому все натуральные числа могут быть представлены. На следующем шаге пробел равен 2, затем 4, затем 8... по мере увеличения показателя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню