Есть ли целые числа, которые двойной не может представлять в диапазоне MIN/MAX двойника?

Я понимаю, что всякий раз, когда речь идет о двойных и плавающих IEEE 754, некоторые числа не могут быть представлены особенно, когда вы пытаетесь представить числа с большим количеством цифр после десятичной точки. Это хорошо понято, но мне было любопытно, были ли какие-либо целые числа в диапазоне MIN/MAX двойного (или плавающего), который не мог быть представлен и, следовательно, необходимо было округлить до ближайшего представимого представления IEEE 754?

Например, очень большие числа иногда представлены в двойных или поплавках, даже если они являются целыми числами. Очевидно, что использование прямого int64 или какого-то такого большого целочисленного типа данных было бы лучше, но люди по-прежнему часто используют удвоения для больших чисел.

Существуют ли какие-либо числа, которые можно вызывать как не представимые, или вы можете дать мне математическую причину, почему это не будет проблемой?

Ответ 1

Конечно, есть целые числа, которые не представляются как плавающие точки с двойной точностью.

Все целые числа, не превышающие Pow(2, 53) или 9007199254740992, представляются. От Pow(2, 53) до Pow(2, 54) (что 18014398509481984) могут быть представлены только четные числа. Нечетные числа будут округлены.

Конечно, так продолжается. От Pow(2, 54) до Pow(2, 55) допускаются только кратные 4 (те целые числа, которые 4 делятся), от Pow(2, 55) до Pow(2, 56), только кратные 8 и т.д.

Это связано с тем, что формат с плавающей запятой с двойной точностью имеет 53 бита (двоичные цифры) для мантиссы (значение).

Легко проверить мои претензии. Например, возьмите число 10000000000000001 как integer64. Преобразуйте его в double, а затем обратно в integer64. Вы увидите потерю точности.

Когда вы принимаете очень большие числа с двойной точностью, конечно, очень мало процентов от числа чисел представляется. Например, вблизи 1E+300 (которое находится между Pow(2, 996) и Pow(2, 997)), мы говорим о кратных значениях Pow(2, 944) (1.4870169084777831E+284). Это согласуется с тем, что a double является точным до приблизительно 16 десятичных цифр. Таким образом, целое число с 300 цифрами будет "запомниться" только его первым приближением. 16 цифр (фактически 53 двоичных разряда).


Дополнение. Первой степенью десяти, которая не является точно представимой, является 1E+23 (или 100 sextillions, стиль наименьшего наименования). Вблизи этого числа представимы только целые кратные 16777216 (то есть Pow(2, 24)), но от десяти до 23-й степени явно не кратно двум до 24-й степени. Первичная факторизация 10**23 == 2**23 * 5**23, поэтому мы можем разделить два раза только 23 раза, а не 24 раза по мере необходимости.