Эти гибкие числа с плавающей запятой состоят из трех частей: цифры, известные как мантисса; порядок – показатель степени, показывающий, где находится запятая; и знаковый бит, который равен 0 для положительного числа и 1 – для отрицательного. В компьютере они выражаются в двоичном формате, так что мантисса состоит из 23 бит, порядок – из 8 бит, плюс знаковый бит (рис. 11). Большинство современных компьютеров используют «числа с плавающей запятой одинарной точности IEEE», которые относятся к техническому стандарту, установленному Институтом инженеров по электротехнике и электронике в 1950-х гг. Именно поэтому мощность компьютера измеряется во флопсах, что означает количество операций с плавающей запятой в секунду.
Рисунок 11. Числа с плавающей запятой одинарной и двойной точности
Хотя числа с плавающей запятой состоят в общей сложности из 32 битов и дают число 232 (всего около четырех миллиардов), существуют также числа двойной точности, которые манипулируют 64 битами и предлагают гораздо больше чисел: 264. Существуют еще более высокие уровни точности, а также числа половинной точности (всего 16 бит), которые стали популярными в машинном обучении для преодоления ограничений памяти и повышения скорости.
Поскольку компьютеры полагаются на арифметику с плавающей запятой, существующую уже несколько десятилетий, они крайне неэффективны. Джон Густафсон из Национального университета Сингапура/A*STAR любит шутить, что числа с плавающей запятой IEEE – это «орудие разрушения математики»[107]. Он отмечает, что, если организовать свой рабочий день так, как это делает компьютер, который требует непропорционально много усилий для перемещения данных, вы бы ехали на работу четыре часа, работали пять минут, а затем тратили еще четыре часа на дорогу домой. Как следствие, на сложение 64-битных чисел расходуется 0,2 миллиардных джоуля энергии, а на чтение 64 бит из памяти – 12 миллиардных долей джоуля.
Чтобы преодолеть эту «стену памяти» и перемещать только значимые данные, Густафсон разработал универсальный формат чисел – unum, – который дает более точные ответы, чем арифметика с плавающей запятой, но зачастую использует меньше битов, экономя память, пропускную способность, энергию и мощность[108]. Густафсон также предложил аппаратную версию unum, являющуюся развитием формата чисел с плавающей запятой, называемую posits: «Если алгоритм выдержал испытание временем как стабильный и „достаточно хороший“ с использованием чисел с плавающей запятой, то с позитами он будет работать еще лучше».
Однако на данный момент компьютеры ограничены набором рациональных чисел с плавающей запятой. Как это ограничивает нашу способность моделировать мир?
Трудности перевода
Прежде чем мы сможем смоделировать человеческое тело на компьютере, в нашу модель необходимо ввести соответствующие данные. Например, чтобы представить потоки крови, нам нужно превратить плавные, непрерывно меняющиеся давления и скорости в единицы и нули чисел с плавающей запятой (рис. 12).
Например, когда дело доходит до чисел одинарной точности, всю путаницу реальности приходится сводить к четырем миллиардам чисел в диапазоне от плюс до минус «бесконечности» (конечно, не самой бесконечности, а просто «очень большого числа» – примерно 2 в степени –127 или +127). Вы можете уловить больше этой реальности, используя массивы чисел или двойную точность, которая предлагает 16 квинтиллионов различных чисел, но числа с плавающей запятой в этом огромном диапазоне распределены неравномерно. Абсолютно неравномерно.
Числа одинарной точности распределяются экспоненциально, как уменьшающиеся степени 2. Этих чисел между 0,125 и 0,25 существует столько же, сколько между 0,25 и 0,5 или между 0,5 и 1 и т. д. Из четырех миллиардов примерно один скрывается между 0 и 1, еще один – между 0 и –1, а остальные два миллиарда охватывают диапазон от ±1 до ± «бесконечности» (рис. 13).
То, как этот уменьшенный набор чисел может затуманить хрустальный шар компьютерного моделирования, было впервые обнаружено в начале 1960-х гг. в Массачусетском технологическом институте в Кембридже, штат Массачусетс, когда метеоролог Эдвард Лоренц (1917–2008) использовал компьютер размером с письменный стол (LGP-30, или компьютер общего назначения Librascope) для разработки простой модели прогнозирования.
107
Black, D. Beating floating point at its own game: Posit arithmetic. Inside HPC (2017). https://insidehpc.com/2017/08/beating-floating-point-game-posit-arithmetic/.