Ответ 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 раза по мере необходимости.