Я знаю, что плавающая точка не идеальна, либо она float
либо double
, но означает ли это, что когда я делю одно число с плавающей запятой на другое, и дивиденд делится делителем без напоминания (например, 10000.0 делится на 10.0), возможно ли, что я получаю номер с.99999999... в конце, который меньше, чем правильный результат крошечной фракцией. Может ли такое произойти с плавающей точкой?
Мне нужно знать, потому что мне нужно использовать функцию floor
после деления, и это будет иметь огромное значение, если деления с плавающей запятой действительно несовершенны.
означает ли это, что когда я делю одно число с плавающей запятой на другое, и дивиденд делится делителем без напоминания (например, 10000.0 делится на 10.0), возможно, что я получаю номер с.99999999... при конец
Нет. Разделение IEEE 754 правильно округлено. Если в результате будет представлен число с плавающей запятой (1000 в вашем примере), это результат, который вы получите для деления.
Что может случиться, так это то, что вы не делите числа, о которых вы думаете, потому что вы написали 0.1
и вы думаете, что это представляет математическое значение 0.1. В этом случае конечный результат может быть неожиданным, но это не ошибка деления с плавающей запятой.
До тех пор, пока вы знаете, что вы делите числа, которые вы имеете в виду, если математический результат деления есть, скажем, целое число ниже 2 24 то результатом деления с плавающей запятой будет это целое число.
Предполагая, что аппаратное обеспечение использует разделение с плавающей запятой IEEE 754, ключевой проблемой является то, являются ли операнды натурального числа точно отображаемыми.
Прежде всего, форматы имеют конечный диапазон. Естественных чисел нет. Однако даже 32-битный двоичный предел с плавающей запятой, около 10 ^ 38, достаточно велик для большинства практических целей.
В пределах этого диапазона сводится к тому, что натуральное число может быть выражено как 1.x*2^n
где n
- целое число, а 1.x
- двоичная дробь с не более чем 23 битами после двоичной точки. Все натуральные числа, которые соответствуют 24 битам, удовлетворяют этому условию. Так что все силы двух, которые находятся в радиусе действия.
В общем, большие поплавки с большими показателями имеют больший разрыв между последовательными значениями. До 24-битных naturals пробел не больше 1, поэтому все натуральные числа могут быть представлены. На следующем шаге пробел равен 2, затем 4, затем 8... по мере увеличения показателя.
1000 / 10
никогда не даст99.9999999