Значение Double
, которое вы видите на выходе, является лишь приближением к некоторому числу значащих цифр.Мы можем видеть более значимые цифры по String(format:)
print(String(format: "%.1f", Double(Int64.max)))
Это печатает:
9223372036854775808.0
Таким образом, на самом деле, разница не так велика, как вы утверждали (193).Это просто разница 1.
Почему есть разница?
Double
сохраняет значение с использованием представления с плавающей запятой.Он может представлять широкий диапазон чисел, но не каждое число в этом диапазоне.Double
использует 53 бита мантиссы, 1 знаковый бит и 11 бит для хранения показателя степени.Мантисса представляет собой значащие цифры числа, а показатель степени говорит вам, где поставить десятичную точку.Все на одной стороне десятичной точки представляют положительные степени 2, а все на другой стороне представляют отрицательные степени 2. Например:
0.1010000 0010
mantissa exponent
Экспонент говорит, чтобы переместить десятичную точку вправо 3 разатак мантисса становится 010.10000
.1
слева представляет 2, а 1 справа представляет половину (2 ^ -1), поэтому это число с плавающей запятой представляет число 2,5
Для представления Int64.max
(2 ^ 63-1), вам нужно 63 бита мантиссы, чтобы все были равны 1 с, а значение в экспоненте - 63. Но Double
не имеет такого количества битов мантиссы!Так что это может быть только приблизительным.Int64.max + 1
на самом деле представляется Double
, потому что оно равно 2^63
.Вам просто нужен один 1
, за которым следуют 52 0
с в мантиссе, и экспонент может хранить 64
.И это то, что Double
сделал.