Основание: почему Int64.max и Double (Int64.max) печатают 2 совершенно разных значения в Swift iOS SDK - PullRequest
0 голосов
/ 22 ноября 2018

Вот мой код Swift

print("\(Int64.max)")
print("\(Double(Int64.max))")

Он производит следующий вывод

9223372036854775807

9.223372036854776e + 18

Почему оба значения совершенно разные 9.223372036854776e + 18 - 9223372036854775807 = 193 FYI

1 Ответ

0 голосов
/ 22 ноября 2018

Значение 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 сделал.

...