Лучше, Чем Плавающий – Новый Формат Чисел Позволяет Избежать Неточностей


Хорошо известно, что компьютеры выполняют арифметику не так, как мы, но если вы думали, что IEEE 754 с плавающей запятой был последним словом, вам нужно переосмыслить. Новый формат под названием unum сохраняет биты во всех смыслах этого слова и обещает лучшую точность.

Было время, когда это было настоящей проблемой. Знание того, как делать арифметику на компьютере, было трудным вызовом – целое число, фиксированная точка, bcd или плавающая точка. Медленно, но верно плавающая точка оказалась лучшим вариантом для общего и научного хруста чисел. Более того, официальный стандарт IEEE 754 не только сделал плавающую точку форматом, который мы все используем, но и определил конкретный набор вариантов формата, который мы используем. Его стандартизация также привела к тому, что оборудование с плавающей запятой стало нормой, а не дополнительным дополнением. В наши дни только небольшим процессорам в стиле Интернета вещей не хватает процессора с плавающей запятой.

Однако с плавающей точкой есть некоторые проблемы. Мы все знаем, что если взять разницу между двумя числами, которые численно близки, результат может быть таким же хорошим, как шум. Например 1.000 007 – 1.000 006 мы получаем 1.000 000×10-6 это выглядит нормально, но обратите внимание, что теперь у нас есть число, которое, похоже, претендует на точность до 10-12, но на самом деле все нули генерируются цифрами, не входящими в исходную пару чисел. Нули на самом деле являются значениями “не знаю”, но они представлены как значения полной точности. 

Формат unum, объясненный Джоном Густафсоном в недавнем интервью журналу ACM Ubiquity, направлен на решение такого рода проблем путем отслеживания и изменения количества используемых битов точности. Название расшифровывается как универсальное число. Это все еще число с плавающей запятой, но у него есть некоторые дополнительные поля:

exp.size и fac.size дают количество битов, предназначенных для представления числа. Однако действительно важным моментом является ubit. Это 1, если число точное, и 0 в противном случае.

Рассмотрим пример вычитания, приведенный ранее. Если оба числа помечены как точные, то генерируемые нули являются реальными и заслуживают использования в дальнейших вычислениях. Если числа неточны, то дополнительная точность не гарантируется, и число должно содержать 1 значащую цифру, а дробные биты могут быть уменьшены. 

Аналогично решается проблема избыточного или недостаточного потока. Числа представлены с достаточной точностью и достаточным динамическим диапазоном. Количество битов экспоненты настраивается таким образом, чтобы результат арифметики был представимым. Конечно, все еще возможно, что в системе может не хватить места для хранения числа, но в этом случае конечным результатом будет наибольшее число, которое можно представить, а не маркер частного случая, такой как бесконечность. 

Использование переменных размеров exp и frac не так революционно, как идея маркировки значений как точных или неточных. Эта единственная функция означает, что один unum может охватывать диапазон значений, указывая, что он неточен. Например, точный unum 0-это просто точка 0 в числовой строке, но неточный 0 представляет все значения между 0 и 1. Другими словами, unums включают интервальную арифметику. 

В интервью есть гораздо больше подробностей, но утверждается, что unums исправляют все сложные проблемы, которые всплывают, ошибаются. Густафсон также утверждает, что до сих пор ему не удалось найти проблему, которая нарушает математику unum.

Это сильное утверждение – можете ли вы его найти?

Когда его спросили, когда unums найдут свой путь на компьютерные языки, ответ был таким::

“Порт Python уже готов, и несколько групп работают над портом C. Поскольку язык Julia особенно хорош для добавления новых типов данных без ущерба для скорости, несколько человек решили сделать порт для Julia, в том числе основатели MIT этого языка. Я узнал о попытке поместить unum math в Java и в D, предполагаемый преемник C++. В зависимости от языка, unums может быть новым типом данных с перегруженными операторами или обрабатываться с помощью вызовов библиотеки. И, конечно же, Mathematica-это язык программирования, и среда прототипов в Mathematica бесплатна для загрузки с веб-сайта CRC Press. Мне бы очень хотелось увидеть версию для Matlab.”

Мнение Густафсона об этом подходе является блестящим:

“Я действительно думаю, что как только люди попробуют этот подход, они не захотят возвращаться к использованию только поплавков. Unums – это то, что плавает для целых чисел. Они являются следующим шагом в эволюции компьютерной арифметики.”

Если вы хотите узнать больше, см. Книгу Густафсона “Конец ошибки: вычисления Unum” (Chapman & Hall/CRC), объясняющую все это, см. боковую панель. 


Добавить комментарий