stringtranslate.com

Арифметика с плавающей запятой

Ранний электромеханический программируемый компьютер Z3 включал в себя арифметику с плавающей запятой (копия выставлена ​​в Немецком музее в Мюнхене ).

В вычислениях арифметика с плавающей запятой ( FP ) — это арифметика , которая представляет подмножества действительных чисел с использованием целого числа с фиксированной точностью, называемой мантиссой , масштабируемой по целочисленному показателю с фиксированной базой. Числа такой формы называются числами с плавающей запятой . [1] : 3  [2] : 10  Например, 12,345 — это число с плавающей запятой в десятичной системе с пятью цифрами точности:

Однако, в отличие от 12,345, 12,3456 не является числом с плавающей запятой в десятичной системе с пятью цифрами точности — для него требуется шесть цифр точности; ближайшее число с плавающей запятой, состоящее всего из пяти цифр, — 12,346. На практике в большинстве систем с плавающей запятой используется основание два , хотя основание десять ( десятичная с плавающей запятой ) также распространено.

Арифметические операции с плавающей запятой, такие как сложение и деление, аппроксимируют соответствующие арифметические операции с действительными числами путем округления любого результата, который сам не является числом с плавающей запятой, до ближайшего числа с плавающей запятой. [1] : 22  [2] : 10  Например, в арифметике с плавающей запятой с точностью до пяти десятичных цифр сумма 12,345 + 1,0001 = 13,3451 может быть округлена до 13,345.

Термин с плавающей запятой относится к тому факту, что точка счисления числа может «плавать» где угодно влево, вправо или между значащими цифрами числа. Эта позиция обозначается экспонентой, поэтому плавающую точку можно рассматривать как форму научной записи .

Систему с плавающей запятой можно использовать для представления с фиксированным количеством цифр чисел самого разного порядка — например, количества метров между галактиками или между протонами в атоме . По этой причине арифметика с плавающей запятой часто используется для обработки очень маленьких и очень больших действительных чисел, требующих быстрого времени обработки. Результатом этого динамического диапазона является то, что числа, которые могут быть представлены, расположены неравномерно; разница между двумя последовательными представимыми числами зависит от их показателя. [3]

Числа с плавающей запятой одинарной точности на числовой строке : зеленые линии обозначают представимые значения.
Дополненная версия выше, показывающая оба знака представимых значений.

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

Скорость операций с плавающей запятой, обычно измеряемая в FLOPS , является важной характеристикой компьютерной системы , особенно для приложений, требующих интенсивных математических вычислений.

Устройство с плавающей запятой (FPU, в просторечии математический сопроцессор ) — это часть компьютерной системы, специально предназначенная для выполнения операций с числами с плавающей запятой.

Обзор

Числа с плавающей запятой

Представление числа определяет некоторый способ кодирования числа, обычно в виде строки цифр.

Существует несколько механизмов, с помощью которых строки цифр могут представлять числа. В стандартной математической записи строка цифр может иметь любую длину, а расположение точки системы счисления указывается путем помещения туда явного символа «точки» (точки или запятой). Если точка счисления не указана, то строка неявно представляет целое число , а неустановленная точка счисления будет находиться за правым концом строки, рядом с наименее значащей цифрой. В системах с фиксированной запятой позиция в строке указывается для точки счисления. Таким образом, схема с фиксированной запятой может использовать строку из 8 десятичных цифр с десятичной точкой посередине, при этом «00012345» будет представлять собой 0001,2345.

В научной записи данное число масштабируется в степени 10 , так что оно находится в определенном диапазоне — обычно от 1 до 10, при этом точка счисления появляется сразу после первой цифры. В качестве степени десяти коэффициент масштабирования указывается отдельно в конце числа. Например, период обращения спутника Юпитера Ио равен152 853,5047 секунды, значение, которое будет представлено в стандартной научной записи как1,528535047 × 10 5 секунд.

Представление с плавающей запятой по своей концепции аналогично научной записи. Логически число с плавающей запятой состоит из:

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

Используя в качестве примера десятичную систему счисления (знакомое десятичное обозначение), число152,853,5047 , которое имеет точность десять десятичных цифр, представлено как мантисса.1 528 535 047 вместе с 5 в качестве показателя степени. Для определения фактического значения после первой цифры мантиссы ставится десятичная точка и результат умножается на 10.5 , чтобы дать1,528535047 × 10 5 , или152 853,5047 . При хранении такого числа нет необходимости сохранять базу (10), поскольку она будет одинаковой для всего диапазона поддерживаемых чисел и, таким образом, ее можно будет вывести.

Символически это окончательное значение равно:

где s — мантисса (без учета любой подразумеваемой десятичной точки), p — точность (количество цифр в мантиссе), b — основание (в нашем примере это число десять ), а e — показатель степени.

Исторически сложилось так, что для представления чисел с плавающей запятой использовалось несколько систем счисления, причем наиболее распространенной была база два ( двоичная ), за которой следовала база десять ( десятичная с плавающей запятой ) и другие менее распространенные разновидности, такие как шестнадцатеричная (шестнадцатеричная с плавающей запятой). [4] [5] [nb 3] ), по основанию восемь (восьмеричная с плавающей запятой [1] [5] [6] [4] [nb 4] ), по основанию четыре (четвертичная с плавающей запятой [7] [5] [nb 5] ), по основанию три ( сбалансированная троичная с плавающей запятой [1] ) и даже по основанию 256 [5] [nb 6] и по основанию65 536 . [8] [номер 7]

Число с плавающей запятой является рациональным числом , поскольку его можно представить как одно целое число, разделенное на другое; например1,45 × 103 равно (145/100)×1000 или145 000/100 . Основание определяет дроби, которые могут быть представлены; например, 1/5 нельзя представить точно как число с плавающей запятой, используя двоичную систему счисления, но 1/5 можно точно представить, используя десятичную систему счисления (0,2 или2 × 10 -1 ). Однако 1/3 не может быть точно представлена ​​ни двоичным (0,010101...), ни десятичным (0,333...), но в системе счисления 3 это тривиально (0,1 или 1×3 −1 ). Случаи, когда происходит бесконечное расширение, зависят от основания и его простых множителей .

Способ хранения мантиссы (включая ее знак) и показателя степени в компьютере зависит от реализации. Распространенные форматы IEEE подробно описаны позже и в других местах, но в качестве примера в двоичном представлении с плавающей запятой одинарной точности (32 бита) , поэтому мантисса представляет собой строку из 24 битов . Например, первые 33 бита числа π :

В этом двоичном расширении давайте обозначим позиции от 0 (крайний левый бит или самый старший бит) до 32 (крайний правый бит). 24-битная мантисса остановится в позиции 23, показанной как подчеркнутый бит.0 выше. Следующий бит в позиции 24 называется битом округления или битом округления . Он используется для округления 33-битного приближения до ближайшего 24-битного числа (существуют определенные правила для промежуточных значений , чего здесь нет). Этот бит, который1 в этом примере добавляется к целому числу, образованному крайними левыми 24 битами, что дает:

Когда это сохраняется в памяти с использованием кодировки IEEE 754, оно становится мантиссой s . Предполагается, что мантисса имеет двоичную точку справа от крайнего левого бита. Итак, двоичное представление числа π вычисляется слева направо следующим образом:

где p — точность (24 в этом примере), n — позиция бита мантиссы слева (начиная с0 и заканчиваем в23 здесь), а e — показатель степени (1 в этом примере).

Может потребоваться, чтобы старшая значащая цифра мантиссы ненулевого числа была ненулевой (за исключением случаев, когда соответствующий показатель степени будет меньше минимального). Этот процесс называется нормализацией . Для двоичных форматов (в которых используются только цифры0 и1 ), эта ненулевая цифра обязательно1 . Следовательно, его не нужно представлять в памяти, что позволяет формату иметь еще один бит точности. Это правило по-разному называется соглашением о ведущих битах , соглашением о неявных битах , соглашением о скрытых битах , [1] или соглашением о предполагаемых битах .

Альтернативы числам с плавающей запятой

Представление с плавающей запятой на сегодняшний день является наиболее распространенным способом представления в компьютерах приближения к действительным числам. Однако есть альтернативы:

История

Леонардо Торрес Кеведо в 1914 году опубликовал анализ чисел с плавающей запятой на основе аналитической машины.

В 1914 году испанский инженер Леонардо Торрес Кеведо опубликовал «Очерки по автоматике» [9] , где он разработал специальный электромеханический калькулятор на основе аналитической машины Чарльза Бэббиджа и описал способ последовательного хранения чисел с плавающей запятой. Он заявил, что числа будут храниться в экспоненциальном формате как n x 10 , и предложил три правила, с помощью которых можно реализовать согласованное манипулирование числами с плавающей запятой машинами. По Торресу, « n всегда будет иметь одинаковое количество цифр (например, шесть), первая цифра n будет порядка десятых, вторая — сотых и т. д., и каждую величину можно будет записать в виде: n ; m . ." Предложенный им формат показывает необходимость мантиссы фиксированного размера, которая в настоящее время используется для данных с плавающей запятой, фиксацию местоположения десятичной точки в мантиссе, чтобы каждое представление было уникальным, а также способы форматирования таких чисел путем указания синтаксиса. для использования, который можно было вводить через пишущую машинку , как это было в случае с его электромеханическим арифмометром в 1920 году. [10] [11] [12]

Конрад Цузе , архитектор компьютера Z3 , который использует 22-битное двоичное представление с плавающей запятой.

В 1938 году Конрад Цузе из Берлина завершил Z1 , первый двоичный программируемый механический компьютер ; [13] он использует 24-битное двоичное представление чисел с плавающей запятой с 7-битной знаковой экспонентой, 17-битной мантиссой (включая один неявный бит) и знаковым битом. [14] Более надежный релейный Z3 , построенный в 1941 году , имеет представления как для положительной, так и для отрицательной бесконечности; в частности, он реализует определенные операции с бесконечностью, такие как , и останавливается на неопределенных операциях, таких как .

Цузе также предложил, но не завершил, тщательно округленную арифметику с плавающей запятой, включающую представления NaN, предвосхитив возможности стандарта IEEE на четыре десятилетия. [15] Напротив, фон Нейман рекомендовал не использовать числа с плавающей запятой в машине IAS 1951 года , утверждая, что арифметика с фиксированной запятой предпочтительнее. [15]

Первым коммерческим компьютером с аппаратным обеспечением для операций с плавающей запятой был компьютер Zuse Z4 , разработанный в 1942–1945 годах. В 1946 году Bell Laboratories представила модель V , в которой реализованы десятичные числа с плавающей запятой . [16]

Pilot ACE имеет двоичную арифметику с плавающей запятой и был введен в эксплуатацию в 1950 году в Национальной физической лаборатории Великобритании . Тридцать три позже были проданы на коммерческой основе как English Electric DEUCE . Арифметика на самом деле реализована программно, но при тактовой частоте в один мегагерц скорость операций с плавающей и фиксированной запятой в этой машине изначально была выше, чем у многих конкурирующих компьютеров.

В 1954 году последовал серийный IBM 704 ; он ввел использование смещенной экспоненты . В течение многих десятилетий после этого оборудование для вычислений с плавающей запятой обычно было необязательной функцией, а компьютеры, на которых оно было, назывались «научными компьютерами» или обладали возможностями « научных вычислений » (SC) (см. также Расширения для научных вычислений (XSC) )). Лишь после запуска Intel i486 в 1989 году персональные компьютеры общего назначения имели аппаратную поддержку операций с плавающей запятой в качестве стандартной функции.

Серия UNIVAC 1100/2200 , представленная в 1962 году, поддерживала два представления с плавающей запятой:

IBM 7094 , также представленный в 1962 году, поддерживал представления с одинарной и двойной точностью, но не имел никакого отношения к представлениям UNIVAC. Действительно, в 1964 году IBM представила шестнадцатеричные представления чисел с плавающей запятой в своих мэйнфреймах System/360 ; эти же представления по-прежнему доступны для использования в современных системах z/Architecture . В 1998 году IBM реализовала в своих мэйнфреймах совместимую с IEEE двоичную арифметику с плавающей запятой; в 2005 году IBM также добавила IEEE-совместимую десятичную арифметику с плавающей запятой.

Первоначально компьютеры использовали множество различных представлений чисел с плавающей запятой. Отсутствие стандартизации на уровне мэйнфреймов было постоянной проблемой к началу 1970-х годов для тех, кто писал и поддерживал исходный код более высокого уровня; Эти стандарты производителей с плавающей запятой различались размерами слов, представлениями, поведением округления и общей точностью операций. Совместимость чисел с плавающей запятой в нескольких вычислительных системах остро нуждалась в стандартизации к началу 1980-х годов, что привело к созданию стандарта IEEE 754 , как только 32-битное (или 64-битное) слово стало обычным явлением. Этот стандарт во многом основывался на предложении Intel, которая разрабатывала числовой сопроцессор i8087 ; Компания Motorola, которая примерно в то же время разрабатывала 68000 , также внесла значительный вклад.

В 1989 году математик и ученый-компьютерщик Уильям Кахан был удостоен премии Тьюринга как главный архитектор этого предложения; ему помогали его ученик Джером Кунен и приглашенный профессор Гарольд Стоун . [17]

Среди нововведений x86 можно выделить следующие:

Диапазон чисел с плавающей запятой

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

В типичной компьютерной системе двоичное число двойной точности (64 бита) с плавающей запятой имеет коэффициент 53 бита (включая 1 подразумеваемый бит), показатель степени 11 бит и 1 знаковый бит. Поскольку 2 10 = 1024, полный диапазон положительных нормальных чисел с плавающей запятой в этом формате составляет от 2 −1022  ≈ 2 × 10 −308 до примерно 2 1024  ≈ 2 × 10 308 .

Количество обычных чисел с плавающей запятой в системе ( B , P , L , U ), где

является .

Существует наименьшее положительное нормальное число с плавающей запятой,

Уровень нижнего перелива = UFL = ,

который имеет 1 в качестве первой цифры и 0 для остальных цифр мантиссы, а также наименьшее возможное значение показателя степени.

Существует наибольшее число с плавающей запятой,

Уровень переполнения = ВЫКЛ = ,

который имеет B - 1 как значение для каждой цифры мантиссы и максимально возможное значение показателя степени.

Кроме того, существуют представимые значения строго между −UFL и UFL. А именно положительные и отрицательные нули , а также субнормальные числа .

IEEE 754: плавающая запятая в современных компьютерах

IEEE стандартизировал компьютерное представление двоичных чисел с плавающей запятой в IEEE 754 (он же IEC 60559) в 1985 году. Этому первому стандарту следуют почти все современные машины. Он был пересмотрен в 2008 году . Мэйнфреймы IBM поддерживают собственный шестнадцатеричный формат с плавающей запятой IBM и десятичный формат с плавающей запятой IEEE 754-2008 в дополнение к двоичному формату IEEE 754. Серия Cray T90 имела версию IEEE, но SV1 по-прежнему использует формат с плавающей запятой Cray. [ нужна цитата ]

Стандарт предусматривает множество тесно связанных форматов, отличающихся лишь некоторыми деталями. Пять из этих форматов называются базовыми форматами , а остальные называются форматами расширенной точности и форматом расширяемой точности . В компьютерном оборудовании и языках особенно широко используются три формата:

Увеличение точности представления с плавающей запятой обычно уменьшает количество накопленных ошибок округления, вызванных промежуточными вычислениями. [24] Другие форматы IEEE включают:

Любое целое число с абсолютным значением меньше 2 24 может быть точно представлено в формате одинарной точности, а любое целое число с абсолютным значением меньше 2 53 может быть точно представлено в формате двойной точности. Кроме того, может быть представлен широкий диапазон степеней, в 2 раза превышающих такое число. Эти свойства иногда используются для чисто целочисленных данных, чтобы получить 53-битные целые числа на платформах, которые имеют числа с плавающей запятой двойной точности, но только 32-битные целые числа.

Стандарт определяет некоторые специальные значения и их представление: положительную бесконечность ( +∞ ), отрицательную бесконечность ( −∞ ), отрицательный ноль (−0), отличный от обычного («положительного») нуля, и «нечисловые» значения ( NaN ).

Сравнение чисел с плавающей запятой, определенное стандартом IEEE, немного отличается от обычного сравнения целых чисел. Отрицательные и положительные нули сравниваются равными, а каждое NaN сравнивается с неравным каждому значению, включая само себя. Все конечные числа с плавающей запятой строго меньше +∞ и строго больше −∞ и упорядочены так же, как и их значения (во множестве действительных чисел).

Внутреннее представительство

Числа с плавающей запятой обычно упаковываются в компьютерные данные в виде бита знака, поля экспоненты и мантиссы или мантиссы слева направо. Для двоичных форматов IEEE 754 (базовых и расширенных), которые имеют существующие аппаратные реализации, они распределяются следующим образом:

Хотя показатель степени может быть положительным или отрицательным, в двоичных форматах он хранится как беззнаковое число, к которому добавлено фиксированное «смещение». Значения всех нулей в этом поле зарезервированы для нулей и субнормальных чисел ; значения всех единиц зарезервированы для бесконечностей и NaN. Диапазон экспоненты для обычных чисел составляет [-126, 127] для одинарной точности, [-1022, 1023] для двойной точности или [-16382, 16383] для четверной точности. Нормальные числа исключают субнормальные значения, нули, бесконечности и NaN.

В форматах двоичного обмена IEEE первый бит нормализованной мантиссы фактически не хранится в компьютерных данных. Его называют «скрытым» или «неявным» битом. Из-за этого формат одинарной точности фактически имеет мантиссу с точностью 24 бита, формат двойной точности — 53, а четырехзначный — 113.

Например, выше было показано, что π, округленное до 24 бит точности, имеет:

Сумма смещения показателя (127) и показателя (1) равна 128, поэтому в формате одинарной точности это представляется как

Пример макета для 32-битной плавающей запятой :

и 64-битная («двойная») раскладка аналогична.

Другие известные форматы с плавающей запятой

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

Представительные числа, преобразование и округление

По своей природе все числа, выраженные в формате с плавающей запятой, являются рациональными числами с завершающим расширением по соответствующему основанию (например, завершающим десятичным расширением по основанию 10 или завершающим двоичным расширением по основанию 2). Иррациональные числа, такие как π или √2, или бесконечные рациональные числа, необходимо аппроксимировать. Количество цифр (или битов) точности также ограничивает набор рациональных чисел, которые могут быть точно представлены. Например, десятичное число 123456789 не может быть точно представлено, если доступны только восемь десятичных цифр точности (оно будет округлено до одного из двух независимых представимых значений: 12345678 × 10 1 или 12345679 × 10 1 ). То же самое относится и к не -конечные цифры ( 0,5 округляется до 0,55555555 или 0,55555556).

Когда число представлено в каком-либо формате (например, в виде символьной строки), который не является собственным представлением с плавающей запятой, поддерживаемым в компьютерной реализации, тогда потребуется преобразование, прежде чем его можно будет использовать в этой реализации. Если число может быть точно представлено в формате с плавающей запятой, тогда преобразование будет точным. Если точного представления нет, то преобразование требует выбора, какое число с плавающей запятой использовать для представления исходного значения. Выбранное представление будет иметь значение, отличное от исходного, и скорректированное таким образом значение называется округленным значением .

Имеет ли рациональное число завершающее расширение или нет, зависит от основания. Например, в десятичной системе число 1/2 имеет завершающее расширение (0,5), а число 1/3 — нет (0,333...). В системе счисления с основанием 2 завершающими являются только рациональные числа со знаменателями, равными степеням 2 (например, 1/2 или 3/16). Любое рациональное число со знаменателем, имеющим простой делитель, отличный от 2, будет иметь бесконечное двоичное разложение. Это означает, что числа, которые кажутся короткими и точными в десятичном формате, возможно, придется аппроксимировать при преобразовании в двоичный формат с плавающей запятой. Например, десятичное число 0,1 не может быть представлено в двоичном формате с плавающей запятой любой конечной точности; точное двоичное представление будет иметь бесконечно продолжающуюся последовательность «1100»:

е = −4; с = 1100110011001100110011001100110011...,

где, как и ранее, s — мантисса, а e — показатель степени.

При округлении до 24 бит это становится

е = −4; с = 110011001100110011001101,

что на самом деле составляет 0,100000001490116119384765625 в десятичном формате.

Еще один пример: действительное число π , представленное в двоичном виде как бесконечная последовательность битов, равно

11.0010010000111111011010101000100010000101101000110000100011010011...

но это

11.0010010000111111011011

при аппроксимации округлением до точности 24 бита.

В двоичном формате с плавающей запятой одинарной точности это представлено как s  = 1,10010010000111111011011 с e  = 1. Это имеет десятичное значение

3.141592 7410125732421875,

тогда как более точное приближение истинного значения π равно

3.14159265358979323846264338327950 ...

Результат округления отличается от истинного значения примерно на 0,03 части на миллион и соответствует десятичному представлению числа π в первых 7 цифрах. Разница заключается в ошибке дискретизации и ограничена машинным эпсилоном .

Арифметическая разность между двумя последовательными представимыми числами с плавающей запятой, имеющими одинаковый показатель степени, называется последней единицей (ULP). Например, если между представимыми числами 1.45a70c22 hex и 1.45a70c24 hex нет представимого числа , ULP равно 2×16 -8 или 2 -31 . Для чисел с частью показателя степени по основанию 2, равной 0, то есть чисел с абсолютным значением больше или равным 1, но меньше 2, ULP составляет точно 2–23 или около 10–7 в одинарной точности и ровно 2–53 . или около 10-16 в двойной точности. Обязательное поведение оборудования, совместимого с IEEE, заключается в том, что результат должен находиться в пределах половины ULP.

Режимы округления

Округление используется, когда для точного результата операции с плавающей запятой (или преобразования в формат с плавающей запятой) потребуется больше цифр, чем цифр в мантиссе. IEEE 754 требует правильного округления : то есть результат округления такой, как если бы для вычисления значения использовалась бесконечно точная арифметика, а затем округлялся (хотя в реализации для обеспечения этого необходимы только три дополнительных бита). Существует несколько различных схем округления (или режимов округления ). Исторически усечение было типичным подходом. С момента появления IEEE 754 чаще используется метод по умолчанию ( округление до ближайшего значения, привязка к четному , иногда называемое банковским округлением). Этот метод округляет идеальный (бесконечно точный) результат арифметической операции до ближайшего представимого значения и выдает это представление в качестве результата. [nb 8] В случае ничьей выбирается значение, при котором мантисса оканчивается четной цифрой. Стандарт IEEE 754 требует, чтобы одно и то же округление применялось ко всем фундаментальным алгебраическим операциям, включая квадратный корень и преобразования, когда имеется числовой результат (не NaN). Это означает, что результаты операций IEEE 754 полностью определены во всех битах результата, за исключением представления NaN. («Библиотечные» функции, такие как косинус и журнал, не являются обязательными.)

Также доступны альтернативные варианты округления. IEEE 754 определяет следующие режимы округления:

Альтернативные режимы полезны, когда количество вносимых ошибок должно быть ограничено. Приложениями, требующими ограниченной ошибки, являются операции с плавающей запятой различной точности и интервальная арифметика . Альтернативные режимы округления также полезны при диагностике числовой нестабильности: если результаты подпрограммы существенно различаются между округлением до + и - бесконечности, то она, вероятно, численно нестабильна и подвержена влиянию ошибки округления. [33]

Преобразование двоично-десятичного числа с минимальным количеством цифр

Преобразование двоичного числа с плавающей запятой двойной точности в десятичную строку является обычной операцией, но алгоритм, дающий одновременно точные и минимальные результаты, не появлялся в печати до 1990 года, когда Стил и Уайт разработали Dragon4. Некоторые из улучшений с тех пор включают в себя:

Многие современные языковые среды выполнения используют Grisu3 с запасным вариантом Dragon4. [40]

Преобразование десятичной системы в двоичную

Проблема преобразования десятичной строки в двоичное представление FP сложна: точный анализатор не появился до работы Клингера 1990 года (реализованной в dtoa.c). [34] Дальнейшая работа также продвигалась в направлении более быстрого синтаксического анализа. [41]

Операции с плавающей запятой

Для простоты представления и понимания в примерах будет использоваться десятичная система счисления с точностью до 7 цифр, как в формате IEEE 754 decimal32 . Фундаментальные принципы одинаковы для любой системы счисления и точности, за исключением того, что нормализация не является обязательной (она не влияет на числовое значение результата). Здесь s обозначает мантиссу, а e обозначает показатель степени.

Сложение и вычитание

Простой метод сложения чисел с плавающей запятой — сначала представить их с одинаковым показателем степени. В приведенном ниже примере второе число сдвигается вправо на три цифры, а затем выполняется обычный метод сложения:

 123456,7 = 1,234567 × 10^5 101,7654 = 1,017654 × 10^2 = 0,001017654 × 10^5
 Следовательно: 123456,7 + 101,7654 = (1,234567 × 10^5) + (1,017654 × 10^2) = (1,234567 × 10^5) + (0,001017654 × 10^5) = (1,234567 + 0,001017654) × 10^5 = 1,235584654 × 10^5

В деталях:

 е=5; с=1,234567 (123456,7)+ е=2; с=1,017654 (101,7654)
 е=5; с=1,234567+ е=5; s=0,001017654 (после смещения)-------------------- е=5; s=1,235584654 (истинная сумма: 123558,4654)

Это истинный результат, точная сумма операндов. Оно будет округлено до семи цифр, а затем при необходимости нормализовано. Конечный результат

 е=5; s=1,235585 (конечная сумма: 123558,5)

Младшие три цифры второго операнда (654) по существу теряются. Это ошибка округления . В крайнем случае сумма двух ненулевых чисел может быть равна одному из них:

 е=5; с=1,234567+ е=−3; с = 9,876543
 е=5; с=1,234567+ е=5; s=0,00000009876543 (после смещения)---------------------- е=5; s=1,23456709876543 (истинная сумма) е=5; s=1,234567 (после округления и нормализации)

В приведенных выше концептуальных примерах может показаться, что сумматору потребуется ввести большое количество дополнительных цифр, чтобы обеспечить правильное округление; однако для двоичного сложения или вычитания с использованием осторожных методов реализации необходимо перенести только защитный бит, бит округления и один дополнительный липкий бит за пределы точности операндов. [42] [43] : 218–220 

Другая проблема потери значимости возникает, когда вычитаются приближения к двум почти равным числам. В следующем примере e  = 5; s  = 1,234571 и е  = 5; s  = 1,234567 являются приближениями к рациональным числам 123457,1467 и 123456,659.

 е=5; с=1,234571− е=5; с=1,234567---------------- е=5; с=0,000004 е=-1; s=4,000000 (после округления и нормализации)

Разница с плавающей запятой вычисляется именно потому, что числа близки — лемма Штербенца гарантирует это даже в случае опустошения, когда поддерживается постепенное опустошение . Несмотря на это, разность исходных чисел равна e  = −1; s  = 4,877000, что более чем на 20% отличается от разницы e  = −1; s  = 4,000000 приближений. В крайних случаях все значащие цифры точности могут быть потеряны. [42] [44] Это исключение иллюстрирует опасность предположения, что все цифры вычисленного результата имеют смысл. Устранение последствий этих ошибок является темой численного анализа ; см. также Проблемы с точностью.

Умножение и деление

При умножении мантиссы умножаются, а показатели степени складываются, а результат округляется и нормализуется.

 е=3; с = 4,734612× е=5; с=5,417242----------------------- е=8; s=25,648538980104 (истинное произведение) е=8; s=25,64854 (после округления) е=9; s=2,564854 (после нормализации)

Точно так же деление осуществляется путем вычитания показателя делителя из показателя делимого и деления мантиссы делимого на мантиссу делителя.

При умножении или делении не возникает проблем со списанием или поглощением, хотя небольшие ошибки могут накапливаться при последовательном выполнении операций. [42] На практике способ выполнения этих операций в цифровой логике может быть довольно сложным (см. Алгоритм умножения Бута и Алгоритм деления ). [nb 9] Быстрый и простой метод см. в методе Хорнера .

Литеральный синтаксис

Литералы для чисел с плавающей запятой зависят от языка. Они обычно используют eили Eдля обозначения научной записи . Язык программирования C и стандарт IEEE 754 также определяют синтаксис шестнадцатеричных литералов с показателем степени по основанию 2 вместо 10. В таких языках, как C , когда десятичный показатель опущен, десятичная точка необходима, чтобы отличить их от целых чисел. Другие языки не имеют целочисленных типов (например, JavaScript ) или допускают перегрузку числовых типов (например, Haskell ). В этих случаях строки цифр, например, 123также могут быть литералами с плавающей запятой.

Примеры литералов с плавающей запятой:

Работа с исключительными случаями

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

До появления стандарта IEEE такие условия обычно приводили к завершению программы или запускали какую-то ловушку , которую программист мог поймать. То, как это работало, зависело от системы, а это означало, что программы с плавающей запятой не были переносимыми . (Термин «исключение», используемый в IEEE 754, является общим термином, означающим исключительное состояние, которое не обязательно является ошибкой, и его использование отличается от того, которое обычно определяется в таких языках программирования, как C++ или Java, в которых « «исключение » — это альтернативный поток управления, близкий к тому, что в терминологии IEEE 754 называется «ловушкой».)

Здесь обсуждается требуемый метод обработки исключений по умолчанию в соответствии со стандартом IEEE 754 (дополнительный режим перехвата исключений IEEE 754 и другие режимы «альтернативной обработки исключений» не обсуждаются). Арифметические исключения (по умолчанию) должны записываться в «фиксированные» биты флага состояния. То, что они «прикреплены», означает, что они не сбрасываются следующей (арифметической) операцией, а остаются установленными до тех пор, пока не будут явно сброшены. Таким образом, использование «липких» флагов позволяет отложить тестирование исключительных условий до тех пор, пока не будет выполнено полное выражение или подпрограмма с плавающей запятой: без них исключительные условия, которые иначе нельзя было бы игнорировать, потребовали бы явного тестирования сразу после каждой операции с плавающей запятой. По умолчанию операция всегда возвращает результат в соответствии со спецификацией, не прерывая вычислений. Например, 1/0 возвращает +∞, а также устанавливает бит флага деления на ноль (это значение по умолчанию, равное ∞, предназначено для того, чтобы часто возвращать конечный результат при использовании в последующих операциях, поэтому его можно безопасно игнорировать).

Однако исходный стандарт IEEE 754 не рекомендовал операции для обработки таких наборов битов флагов арифметических исключений. Таким образом, хотя они были реализованы аппаратно, изначально реализации языков программирования обычно не предоставляли средств доступа к ним (кроме ассемблера). Со временем некоторые стандарты языков программирования (например, C99 /C11 и Fortran) были обновлены, чтобы определить методы доступа и изменения битов флага состояния. Версия стандарта IEEE 754 2008 года теперь определяет несколько операций для доступа и обработки битов арифметических флагов. Модель программирования основана на одном потоке выполнения, и их использование несколькими потоками должно обрабатываться средствами, выходящими за рамки стандарта (например, C11 указывает, что флаги имеют локальное хранилище потока ).

IEEE 754 определяет пять арифметических исключений, которые должны быть записаны во флагах состояния («липкие биты»):

Рис. 1: сопротивления параллельно, с общим сопротивлением

Возвращаемое значение по умолчанию для каждого исключения предназначено для получения правильного результата в большинстве случаев, поэтому исключения можно игнорировать в большинстве кодов. inexact возвращает правильно округленный результат, а underflow возвращает значение, меньшее или равное наименьшему положительному нормальному числу по величине, и его почти всегда можно игнорировать. [45] деление на ноль возвращает точно бесконечность, которая обычно затем делит конечное число и, таким образом, дает ноль, или в противном случае впоследствии выдает недопустимое исключение , и поэтому его также обычно можно игнорировать. Например, эффективное сопротивление n резисторов, включенных параллельно (см. рис. 1), определяется выражением . Если при значении 0 возникает короткое замыкание , возвращается +бесконечность, что дает конечное значение 0, как и ожидалось [46] ( другой пример см. в примере с непрерывной дробью в обосновании конструкции IEEE 754 ).

Исключения переполнения и недействительные исключения обычно нельзя игнорировать, но они не обязательно представляют собой ошибки: например, процедура поиска корня в рамках своей обычной работы может оценивать переданную функцию со значениями за пределами ее домена, возвращая NaN и недопустимый флаг исключения, который следует игнорировать до тех пор , пока не будет найдена полезная отправная точка. [45]

Проблемы с точностью

Тот факт, что числа с плавающей запятой не могут точно представлять все действительные числа, а операции с плавающей запятой не могут точно представлять истинные арифметические операции, приводит ко многим удивительным ситуациям. Это связано с конечной точностью , с которой компьютеры обычно представляют числа.

Например, десятичные числа 0,1 и 0,01 не могут быть представлены точно как двоичные числа с плавающей запятой. В формате IEEE 754binary32 с его 24-битным мантиссом результат попытки возвести в квадрат приближение к 0,1 не является ни 0,01, ни ближайшим к нему представимым числом. Десятичное число 0,1 представлено в двоичном виде как e  = −4 ; s  = 110011001100110011001101 , что

0,100000001490116119384765625 ровно.

Возведение этого числа в квадрат дает

0,010000000298023226097399174250313080847263336181640625 точно.

Возведение его в квадрат с округлением до 24-битной точности дает

0,010000000707805156707763671875 ровно.

Но представимое число, ближайшее к 0,01, равно

0,009999999776482582092285156250 ровно.

Кроме того, непредставимость π (и π/2) означает, что попытка вычисления tan(π/2) не даст бесконечного результата и даже не переполнится в обычных форматах с плавающей запятой (при условии точного вычисления). реализация загара). Для стандартного оборудования с плавающей запятой просто невозможно попытаться вычислить tan(π/2), поскольку π/2 не может быть представлено точно. Это вычисление в C:

/* Достаточно цифр, чтобы быть уверенным, что мы получили правильное приближение. */ двойное число пи = 3,1415926535897932384626433832795 ; двойной z = загар ( пи / 2,0 );      

даст результат 16331239353195370.0. В одинарной точности (с использованием tanfфункции) результат будет −22877332,0.

Точно так же попытка вычисления sin(π) не даст нулевого результата. Результат будет (приблизительно) 0,1225 × 10 −15 при двойной точности или −0,8742 × 10 −7 при одинарной точности. [номер 10]

Хотя сложение и умножение с плавающей запятой являются коммутативными ( a + b = b + a и a × b = b × a ), они не обязательно ассоциативны . То есть ( a + b ) + c не обязательно равно a + ( b + c ) . Используя 7-значную десятичную арифметику:

а = 1234,567, б = 45,67834, с = 0,0004
(а + б) + в: 1234,567 (а) + 45.67834 (б) ____________ 1280,24534 округляется до 1280,245
 1280,245 (а + б) + 0,0004 (в) ____________ 1280,2454 округления до 1280,245 ← (a + b) + c
а + (б + в): 45,67834 (б) + 0,0004 (в) ____________ 45,67874
 1234,567 (а) +45.67874 (б+в) ____________ 1280,24574 округляется до 1280,246 ← a + (b + c)

Они также не обязательно являются распределительными . То есть ( a + b ) × c может не совпадать с a × c + b × c :

1234,567 × 3,333333 = 4115,223 1,234567 × 3,333333 = 4,115223 4115,223 + 4,115223 = 4119,338 но 1234,567 + 1,234567 = 1235,802 1235,802 × 3,333333 = 4119,340

Помимо потери значимости, невозможности точного представления таких чисел, как π и 0,1, а также других небольших неточностей, могут возникнуть следующие явления:

Инциденты

Точность станка и обратный анализ ошибок

Машинная точность — это величина, которая характеризует точность системы с плавающей запятой и используется при обратном анализе ошибок алгоритмов с плавающей запятой. Оно также известно как единичное округление или машинный эпсилон . Обычно обозначается Ε мах , его значение зависит от конкретного используемого округления.

С округлением до нуля

BPB

Это важно, поскольку оно ограничивает относительную ошибку представления любого ненулевого действительного числа x в нормализованном диапазоне системы с плавающей запятой:

Обратный анализ ошибок, теория которого была разработана и популяризирована Джеймсом Х. Уилкинсоном , может использоваться для установления того, что алгоритм, реализующий числовую функцию, численно устойчив. [50] Основной подход заключается в том, чтобы показать, что, хотя вычисленный результат из-за ошибок округления не будет абсолютно правильным, он является точным решением соседней задачи со слегка искаженными входными данными. Если требуемое возмущение невелико, порядка неопределенности входных данных, то результаты в некотором смысле настолько точны, насколько «заслуживают» данные. Тогда алгоритм определяется как обратно стабильный . Стабильность — это мера чувствительности к ошибкам округления данной числовой процедуры; напротив, число обусловленности функции для данной проблемы указывает на внутреннюю чувствительность функции к небольшим возмущениям на ее входных данных и не зависит от реализации, используемой для решения проблемы. [51]

В качестве тривиального примера рассмотрим простое выражение, дающее скалярное произведение векторов (длины два) и , затем

где

где

по определению, которая представляет собой сумму двух слегка возмущенных (порядка Емах ) входных данных и поэтому является обратно устойчивой. Более реалистичные примеры числовой линейной алгебры см. в Higham 2002 [52] и других ссылках ниже.

Минимизация влияния проблем с точностью

Хотя отдельные арифметические операции IEEE 754 гарантированы с точностью до половины ULP , более сложные формулы могут содержать более крупные ошибки по ряду причин. Потеря точности может быть существенной, если задача или ее данные плохо обусловлены , а это означает, что правильный результат сверхчувствителен к малейшим отклонениям в данных. Однако даже хорошо обусловленные функции могут пострадать от большой потери точности, если используется алгоритм , численно нестабильный для этих данных: очевидно эквивалентные формулировки выражений на языке программирования могут заметно отличаться по своей числовой стабильности. Одним из подходов к устранению риска такой потери точности является разработка и анализ численно устойчивых алгоритмов, что является целью раздела математики, известного как численный анализ . Другой подход, который может защитить от риска числовых нестабильностей, - это вычисление промежуточных (царапающих) значений в алгоритме с более высокой точностью, чем требует конечный результат, [ 53] который можно удалить или уменьшить на порядки, [54] такой риск: для этой цели при вычислениях с двойной точностью предназначены стандарты IEEE 754 с учетверенной точностью и расширенной точностью . [55] [№ 11]

Например, следующий алгоритм представляет собой прямую реализацию вычисления функции A ( x ) = ( x −1) / (exp( x −1) − 1) , которая хорошо обусловлена ​​при 1,0, [nb 12], однако она может будет показано, что они численно нестабильны и теряют до половины значащих цифр, содержащихся в арифметике, при вычислении около 1,0. [56]

двойной А ( двойной Х )  { двойной Y , Z ; // [1]    Y = Х - 1,0 ;     Z = опыт ( Y );   если ( Z != 1,0 )    Z = Y / ( Z - 1,0 ); // [2]        вернуть Z ; }

Однако если все промежуточные вычисления выполняются с повышенной точностью (например, путем установки строки [1] в C99 long double ), то в окончательном двойном результате может поддерживаться полная точность. [nb 13] Альтернативно, численный анализ алгоритма показывает, что если сделано следующее неочевидное изменение в строке [2]:

Z = журнал ( Z ) / ( Z - 1,0 );      

тогда алгоритм становится численно стабильным и может выполнять вычисления с полной двойной точностью.

Чтобы сохранить свойства таких тщательно построенных численно стабильных программ, требуется осторожное обращение со стороны компилятора . Определенные «оптимизации», которые могут сделать компиляторы (например, изменение порядка операций), могут противоречить целям обеспечения хорошего поведения программного обеспечения. Существуют некоторые разногласия по поводу недостатков компиляторов и конструкции языка в этой области: C99 является примером языка, в котором такие оптимизации тщательно определены для поддержания числовой точности. См. внешние ссылки внизу этой статьи.

Подробное рассмотрение методов написания высококачественного программного обеспечения для операций с плавающей запятой выходит за рамки этой статьи, и читателю отсылаем к [52] , [57] и другим ссылкам внизу этой статьи. Кахан предлагает несколько практических правил, которые могут существенно снизить на порядки [57] риск числовых аномалий в дополнение к более тщательному численному анализу или вместо него. К ним относятся: как отмечалось выше, вычисление всех выражений и промежуточных результатов с высочайшей точностью, поддерживаемой аппаратным обеспечением (общее практическое правило состоит в том, чтобы иметь двойную точность желаемого результата, т.е. вычислять с двойной точностью для окончательного результата с одинарной точностью); или в двойной расширенной или учетверенной точности для получения результатов с двойной точностью [58] ); и округление входных данных и результатов только до точности, требуемой и поддерживаемой входными данными (избыточная точность конечного результата, превышающая требуемую и поддерживаемую входными данными, может ввести в заблуждение, увеличивает стоимость хранения и снижает скорость, а лишние биты могут влияют на сходимость численных процедур: [59] в частности, первая форма итерационного примера, приведенного ниже, сходится правильно при использовании этого эмпирического правила). Далее следуют краткие описания нескольких дополнительных проблем и методов.

Поскольку десятичные дроби часто невозможно точно представить в двоичном формате с плавающей запятой, такая арифметика дает наилучшие результаты, когда ее просто используют для измерения реальных величин в широком диапазоне масштабов (например, периода обращения Луны вокруг Сатурна). или масса протона ) , и в худшем случае, когда ожидается моделирование взаимодействия величин, выраженных в виде десятичных строк, которые должны быть точными. [54] [57] Примером последнего случая являются финансовые расчеты. По этой причине финансовое программное обеспечение, как правило, не использует представление двоичных чисел с плавающей запятой. [60] Тип данных «десятичный» в языках программирования C# и Python , а также десятичные форматы стандарта IEEE 754-2008 разработаны, чтобы избежать проблем двоичных представлений с плавающей запятой при применении к точным десятичным значениям, введенным человеком. и заставить арифметику всегда вести себя должным образом, когда числа печатаются в десятичном формате.

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

Использование проверки равенства ( if (x==y) ...) требует осторожности при работе с числами с плавающей запятой. Даже простые выражения, такие как 0.6/0.2-3==0will, на большинстве компьютеров неверны [61] (например, в IEEE 754 двойная точность 0.6/0.2 - 3примерно равна -4,44089209850063e-16). Следовательно, такие тесты иногда заменяются «нечеткими» сравнениями ( if (abs(x-y) < epsilon) ...где эпсилон достаточно мал и адаптирован к приложению, например 1.0E-13). Разумность этого сильно различается и может потребовать численного анализа для определения эпсилона. [52] Значения, полученные на основе представления первичных данных, и их сравнения должны выполняться с более широкой и расширенной точностью, чтобы свести к минимуму риск таких несоответствий из-за ошибок округления. [57] Зачастую лучше организовать код таким образом, чтобы такие тесты были ненужными. Например, в вычислительной геометрии точные проверки того, находится ли точка вне линии или плоскости, определяемой другими точками, или находятся на ней, могут быть выполнены с использованием методов адаптивной точности или точной арифметики. [62]

Небольшие ошибки в арифметике с плавающей запятой могут вырасти, когда математические алгоритмы выполняют операции огромное количество раз. Несколько примеров: инверсия матрицы , вычисление собственных векторов и решение дифференциальных уравнений. Чтобы эти алгоритмы работали хорошо , их необходимо разрабатывать очень тщательно с использованием численных подходов, таких как итеративное уточнение . [63]

Суммирование вектора значений с плавающей запятой является основным алгоритмом в научных вычислениях , поэтому понимание того, когда может произойти потеря значимости, имеет важное значение. Например, если складывать очень большое количество чисел, отдельные слагаемые будут очень малы по сравнению с суммой. Это может привести к потере значимости. Типичным дополнением будет что-то вроде

3253,671+ 3.141276-----------3256,812

Младшие 3 цифры слагаемых фактически теряются. Предположим, например, что нужно сложить много чисел, все примерно равных 3. После того, как их сложено 1000, текущая сумма составит около 3000; потерянные цифры не восстанавливаются. Для уменьшения ошибок можно использовать алгоритм суммирования Кахана . [52]

Ошибка округления может повлиять на сходимость и точность итерационных численных процедур. Например, Архимед аппроксимировал число π, вычислив периметры многоугольников, вписывающих и описывающих круг, начиная с шестиугольников и последовательно удваивая количество сторон. Как отмечалось выше, вычисления можно перестроить таким образом, чтобы это было математически эквивалентно, но менее подвержено ошибкам ( числовой анализ ). Две формы рекуррентной формулы для описанного многоугольника :

Вот вычисление с использованием «двойной» арифметики IEEE (мантисса с точностью 53 бита):

я 6 × 2 i × t i , первая форма 6 × 2 i × t i , вторая форма-------------------------------------------------- ------- 0 3 .4641016151377543863 3 .4641016151377543863 1 3 .2153903091734710173 3 .2153903091734723496 2 3.1 596599420974940120 3.1 596599420975006733 3 3,14 60862151314012979 3,14 60862151314352708 4 3.14 27145996453136334 3.14 27145996453689225 5 3.141 8730499801259536 3.141 8730499798241950 6 3.141 6627470548084133 3.141 6627470568494473 7 3.141 6101765997805905 3.141 6101766046906629 8 3.14159 70343230776862 3.14159 70343215275928 9 3.14159 37488171150615 3.14159 3748771353666810 3.141592 9278733740748 3.141592 927385097988511 3.141592 7256228504127 3.141592 722038614837712 3.1415926 717412858693 3.1415926 70701999212513 3.1415926 189011456060 3.14159265 7867845472814 3.1415926 717412858693 3.14159265 4659307370915 3.14159 19358822321783 3.141592653 857173011916 3.1415926 717412858693 3.141592653 656639422217 3.1415 810075796233302 3.141592653 606506191318 3.1415926 717412858693 3.1415926535 93972883619 3.141 4061547378810956 3.1415926535 90839390120 3.14 05434924008406305 3.1415926535 90056016821 3.14 00068646912273617 3.141592653589 860839622 3,1 349453756585929919 3.141592653589 812211823 3,14 00068646912273617 3,14159265358979 9555224 3 .2245152435345525443 3.14159265358979 6890725 3.14159265358979 6224626 3.14159265358979 6224627 3.14159265358979 6224628 3.14159265358979 62246 Истинное значение: 3,14159265358979323846264338327...

Хотя две формы рекуррентной формулы явно математически эквивалентны, [nb 14] первая вычитает 1 из числа, чрезвычайно близкого к 1, что приводит к все более проблематичной потере значащих цифр . Поскольку повторение применяется неоднократно, точность сначала улучшается, но затем ухудшается. Оно никогда не становится лучше, чем примерно 8 цифр, даже несмотря на то, что 53-битная арифметика должна обеспечивать точность около 16 цифр. Когда используется вторая форма повторения, значение сходится к точности 15 цифр.

Оптимизация «Быстрая математика»

Вышеупомянутое отсутствие ассоциативности операций с плавающей запятой в целом означает, что компиляторы не могут переупорядочивать арифметические выражения так же эффективно, как при целочисленной арифметике и арифметике с фиксированной запятой, что представляет собой препятствие для таких оптимизаций, как исключение общих подвыражений и авто- векторизация . [64] Опция «быстрая математика» во многих компиляторах (ICC, GCC, Clang, MSVC...) включает повторную ассоциацию вместе с небезопасными предположениями, такими как отсутствие NaN и бесконечных чисел в IEEE 754. Некоторые компиляторы также предлагают более детальную обработку. опции, чтобы включить только переассоциацию. В любом случае программист сталкивается со многими ошибками точности, упомянутыми выше, в части программы, использующей «быстрые» математические вычисления. [65]

В некоторых компиляторах (GCC и Clang) включение «быстрых» математических вычислений может привести к тому, что программа отключит ненормальные числа с плавающей запятой при запуске, влияя на поведение с плавающей запятой не только сгенерированного кода, но и любой программы, использующей такой код в качестве библиотеки . [66]

В большинстве компиляторов Фортрана , как это разрешено стандартом Фортрана ISO/IEC 1539-1:2004, повторное связывание используется по умолчанию, при этом поломка в значительной степени предотвращается с помощью настройки «защитить круглые скобки» (также включенной по умолчанию). Этот параметр не позволяет компилятору повторно связываться за пределами круглых скобок. [67] Компилятор Intel Fortran является заметным исключением. [68]

Распространенной проблемой в «быстрой» математике является то, что подвыражения не могут быть одинаково оптимизированы от места к месту, что приводит к неожиданным различиям. Одна из интерпретаций проблемы заключается в том, что «быстрая» математика в ее нынешнем виде имеет плохо определенную семантику. Одна из попыток формализовать «быстрые» математические оптимизации можно увидеть в проверенном компиляторе Icing . [69]

Смотрите также

Примечания

  1. ^ Некоторые авторы также называют мантиссу числа с плавающей запятой — не путать с мантиссой логарифма . Некоторые также используют несколько расплывчатые термины, такие как коэффициент или аргумент . Использование термина «доля» некоторыми авторами также потенциально вводит в заблуждение. Термин «характеристика» (используемый, например, CDC ) неоднозначен, поскольку исторически он также использовался для указания некоторой формы показателя степени чисел с плавающей запятой.
  2. ^ Показатель степени числа с плавающей запятой иногда также называют масштабом . Термин «характеристика» (для смещенной экспоненты , смещения экспоненты или представления избыточного n ) неоднозначен, поскольку исторически он также использовался для указания мантиссы чисел с плавающей запятой.
  3. ^ Шестнадцатеричная (основание 16) арифметика с плавающей запятой используется в IBM System 360 (1964) и 370 (1970), а также в различных новых машинах IBM, в RCA Spectra 70 (1964), Siemens 4004 (1965), Мэйнфреймы серий 7.700 (1974), 7.800, 7.500 (1977) и их преемники, мэйнфреймы серии Unidata 7.000, компьютеры Manchester MU5 (1972), HEP (1982), а также семейства мэйнфреймов, совместимых с 360/370, производства Fujitsu, Amdahl. и Хитачи. Он также используется в Illinois ILLIAC III (1966 г.), Data General Eclipse S/200 (около 1974 г.), Gould Powernode 9080 (1980-е гг.), Interdata 8/32 (1970-е гг.), SEL Systems 85 и 86, а также в SDS Sigma 5 (1967 г.), 7 (1966 г.) и Xerox Sigma 9 (1970 г.).
  4. ^ Восьмеричная арифметика с плавающей запятой (основание 8) используется в компьютерах Ferranti Atlas (1962), Burroughs B5500 (1964), Burroughs B5700 (1971), Burroughs B6700 (1971) и Burroughs B7700 (1972).
  5. ^ Четвертичная арифметика с плавающей запятой (основание 4) используется в компьютере Illinois ILLIAC II (1962). Он также используется в системах съемки местности с высоким разрешением Digital Field System DFS IV и V.
  6. ^ Арифметика с плавающей запятой по основанию 256 используется в компьютере R1 Института Райса (с 1958 года).
  7. ^ Арифметика с плавающей запятой Base-65536 используется в компьютере MANIAC II (1956).
  8. ^ Компьютерное оборудование не обязательно вычисляет точное значение; он просто должен выдать эквивалентный округленный результат, как если бы он вычислил бесконечно точный результат.
  9. ^ Огромная сложность современных алгоритмов деления однажды привела к известной ошибке. Ранняя версия процессора Intel Pentium поставлялась с инструкцией деления , которая в редких случаях давала слегка неправильные результаты. Многие компьютеры были отправлены до того, как ошибка была обнаружена. Пока неисправные компьютеры не были заменены, разрабатывались исправленные версии компиляторов, позволяющие избежать случаев сбоя. См. ошибку Pentium FDIV .
  10. ^ Но попытка вычисления cos(π) дает ровно −1. Поскольку производная близка к нулю вблизи π, влияние неточности аргумента намного меньше, чем расстояние между числами с плавающей запятой вокруг −1, и округленный результат является точным.
  11. Уильям Кахан отмечает: «За исключением крайне редких ситуаций, сверхточная арифметика обычно снижает риски, связанные с округлением, при гораздо меньших затратах, чем цена компетентного аналитика ошибок».
  12. ^ Разложение Тейлора этой функции показывает, что она хорошо обусловлена ​​вблизи 1: A(x) = 1 - (x-1)/2 + (x-1)^2/12 - (x-1)^4/ 720 + (x−1)^6/30240 − (x−1)^8/1209600 + ... для |x−1| < π.
  13. ^ Если long double соответствует четырехзначной точности IEEE , то сохраняется полная двойная точность; если long double — это расширенная двойная точность IEEE , то сохраняется дополнительная, но не полная точность.
  14. ^ Эквивалентность двух форм можно проверить алгебраически, заметив, что знаменатель дроби во второй форме является сопряженным числителю первой. Умножив верхнюю и нижнюю часть первого выражения на это сопряженное, можно получить второе выражение.

Рекомендации

  1. ^ abcdef Мюллер, Жан-Мишель; Бризебар, Николя; де Динешен, Флоран; Жаннерод, Клод-Пьер; Лефевр, Винсент; Мелькионд, Гийом; Револь, Натали ; Стеле, Дэмиен; Торрес, Серж (2010). Справочник по арифметике с плавающей запятой (1-е изд.). Биркхойзер . дои : 10.1007/978-0-8176-4705-6. ISBN 978-0-8176-4704-9. LCCN  2009939668.
  2. ^ аб Стербенс, Пэт Х. (1974). Вычисление с плавающей запятой. Энглвуд Клиффс, Нью-Джерси, США: Прентис-Холл. ISBN 0-13-322495-3.
  3. ^ Смит, Стивен В. (1997). «Глава 28, Фиксированная и плавающая точка». Руководство для ученых и инженеров по цифровой обработке сигналов . Калифорнийский технический паб. п. 514. ИСБН 978-0-9660176-3-2. Проверено 31 декабря 2012 г.
  4. ^ аб Зеенднер, Эберхард (лето 2008 г.). «Rechnerarithmetik: Fest- und Gleitkommasysteme» (PDF) (сценарий лекции) (на немецком языке). Йенский университет имени Фридриха Шиллера . п. 2. Архивировано (PDF) из оригинала 7 августа 2018 г. Проверено 7 августа 2018 г.[1] (Обратите внимание: в этой ссылке ошибочно указано число 256 с плавающей запятой MANIAC II, тогда как на самом деле оно равно 65536.)
  5. ^ abcd Биб, Нельсон HF (22 августа 2017 г.). «Глава H. Исторические архитектуры с плавающей запятой». Справочник по математическим вычислениям - Программирование с использованием портативной библиотеки программного обеспечения MathCW (1-е изд.). Солт-Лейк-Сити, Юта, США: Springer International Publishing AG . п. 948. дои : 10.1007/978-3-319-64110-2. ISBN 978-3-319-64109-6. LCCN  2017947446. S2CID  30244721.
  6. Савард, Джон Дж. Г. (2018) [2007], «Стандарт десятичных чисел с плавающей запятой», Quadbloc , заархивировано из оригинала 03 июля 2018 г. , получено 16 июля 2018 г.
  7. ^ Паркинсон, Роджер (7 декабря 2000 г.). «Глава 2 — Системы цифровой съемки местности с высоким разрешением — Глава 2.1 — Цифровые системы полевой регистрации». Обследования объектов с высоким разрешением (1-е изд.). ЦРК Пресс . п. 24. ISBN 978-0-20318604-6. Проверено 18 августа 2019 г. […] Такие системы, как [Цифровая полевая система] DFS IV и DFS V, представляли собой четверичные системы с плавающей запятой и использовали шаг усиления 12 дБ. […](256 страниц)
  8. ^ Лазарус, Роджер Б. (30 января 1957 г.) [1 октября 1956 г.]. «МАНИАК II» (PDF) . Лос-Аламос, Нью-Мексико, США: Лос-Аламосская научная лаборатория Калифорнийского университета. п. 14. ЛА-2083. Архивировано (PDF) из оригинала 7 августа 2018 г. Проверено 7 августа 2018 г. […] плавучая база Маньяка, равная 2 16 = 65 536. […] Большая база Маньяка позволяет значительно увеличить скорость арифметических операций с плавающей запятой. Хотя такая большая база предполагает возможность использования до 15 ведущих нулей, большой размер слова в 48 бит гарантирует адекватную значимость. […]
  9. ^ Торрес Кеведо, Леонардо. Automática: Complemento de la Teoría de las Máquinas, (pdf), стр. 575–583, Revista de Obras Públicas, 19 ноября 1914 г.
  10. ^ Рональд Т. Кнезель. Числа и компьютеры, Springer, стр. 84–85, 2017. ISBN 978-3319505084. 
  11. ^ Рэнделл 1982, стр. 6, 11–13.
  12. ^ Рэнделл, Брайан. Цифровые компьютеры, История происхождения, (pdf), стр. 545, Цифровые компьютеры: происхождение, Энциклопедия информатики, январь 2003 г.
  13. ^ Рохас, Рауль (апрель – июнь 1997 г.). «Наследие Конрада Цузе: архитектура Z1 и Z3» (PDF) . IEEE Анналы истории вычислений . 19 (2): 5–16. дои : 10.1109/85.586067. Архивировано (PDF) из оригинала 3 июля 2022 г. Проверено 03 июля 2022 г.(12 страниц)
  14. ^ Рохас, Рауль (07.06.2014). «Z1: Архитектура и алгоритмы первого компьютера Конрада Цузе». arXiv : 1406.1886 [cs.AR].
  15. ^ Аб Кахан, Уильям Мортон (15 июля 1997 г.). «Пагубное влияние компьютерных языков и тестов на прикладную математику, физику и химию. Лекция Джона фон Неймана» (PDF) . п. 3. Архивировано (PDF) из оригинала 5 сентября 2008 г.
  16. ^ Рэнделл, Брайан , изд. (1982) [1973]. Истоки цифровых компьютеров: избранные статьи (3-е изд.). Берлин; Нью-Йорк: Springer-Verlag . п. 244. ИСБН 978-3-540-11319-5.
  17. ^ Северанс, Чарльз (20 февраля 1998 г.). «Интервью со стариком с плавающей запятой».
  18. ^ ISO/IEC 9899:1999 — Языки программирования — C. Исо.орг. §F.2, примечание 307.«Расширенный» — это двойной расширенный формат данных IEC 60559. Расширенный относится как к обычному 80-битному, так и к четырехкратному 128-битному формату IEC 60559.
  19. ^ «Представление IEEE с плавающей запятой» . 03.08.2021.
  20. ^ Использование коллекции компиляторов GNU, параметры i386 и x86-64, заархивировано 16 января 2015 г. на Wayback Machine .
  21. ^ «long double (специфично для GCC) и __float128». Переполнение стека .
  22. ^ «Стандарт вызова процедур для 64-битной архитектуры ARM (AArch64)» (PDF) . 22 мая 2013 г. Архивировано (PDF) из оригинала 31 июля 2013 г. Проверено 22 сентября 2019 г.
  23. ^ «Справочник по компилятору набора инструментов ARM Compiler, версия 5.03» (PDF) . 2013. Раздел 6.3 Основные типы данных . Архивировано (PDF) из оригинала 27 июня 2015 г. Проверено 08.11.2019 .
  24. ^ Кахан, Уильям Мортон (20 ноября 2004 г.). «О стоимости вычислений с плавающей запятой без сверхточной арифметики» (PDF) . Архивировано (PDF) из оригинала 25 мая 2006 г. Проверено 19 февраля 2012 г.
  25. Ссылки _ открытьEXR . Проверено 25 апреля 2012 г.
  26. ^ «Анализ IEEE-754» .
  27. ^ сотрудники Ab Borland (02 июля 1998 г.) [10 марта 1994 г.]. «Преобразование между форматами Microsoft Binary и IEEE». База данных технической информации (TI1431C.txt). Embarcadero USA / Inprise (первоначально: Borland ). ID 1400. Архивировано из оригинала 20 февраля 2019 г. Проверено 30 мая 2016 г. […] _fmsbintoieee(float *src4, float *dest4) […] Двоичный формат MS […] порядок байтов => m3 | м2 | м1 | экспонента […] m1 — старший байт => sbbb|bbbb […] m3 — младший байт […] m = байт мантиссы […] s = знаковый бит […] b = бит […] MBF — смещение 128 а IEEE — смещение 127. […] MBF ставит десятичную точку перед предполагаемым битом , а IEEE помещает десятичную точку после предполагаемого бита. […] ieee_exp = msbin[3] - 2; /* на самом деле, msbin[3]-1-128+127 */ […] _dmsbintoieee(double *src8, double *dest8) […] Двоичный формат MS […] порядок байтов => m7 | м6 | м5 | м4 | м3 | м2 | м1 | экспонента […] m1 — старший байт => smmm|mmmm […] m7 — младший байт […] MBF — это смещение 128, а IEEE — это смещение 1023. […] MBF ставит десятичную точку перед предполагаемым битом, а IEEE ставит десятичную точку после предполагаемого бита. […] ieee_exp = msbin[7] - 128 - 1 + 1023; […]
  28. ^ Аб Стейл, Майкл (20 октября 2008 г.). «Создайте свою собственную версию Microsoft BASIC для 6502». pagetable.com. Архивировано из оригинала 30 мая 2016 г. Проверено 30 мая 2016 г.
  29. ^ «IEEE против двоичного формата Microsoft; проблемы округления (завершено)» . Поддержка Майкрософт . Майкрософт . 21 ноября 2006 г. Идентификатор статьи KB35826, Q35826. Архивировано из оригинала 28 августа 2020 г. Проверено 24 февраля 2010 г.
  30. ^ Аб Харья, Пареш (14 мая 2020 г.). «TensorFloat-32 в графическом процессоре A100 ускоряет обучение ИИ, HPC до 20 раз» . Проверено 16 мая 2020 г.
  31. ^ "Подробное описание архитектуры NVIDIA Hopper" . 2022-03-22.
  32. ^ Мицикявичюс, Паулюс; Стосич, Душан; Берджесс, Нил; Роговица, Мариус; Дубей, Прадип; Гризентуэйт, Ричард; Ха, Санвон; Хайнеке, Александр; Джадд, Патрик; Камалу, Джон; Меллемпуди, Навин; Оберман, Стюарт; Шойби, Мохаммед; Сиу, Майкл; Ву, Хао (12 сентября 2022 г.). «Форматы FP8 для глубокого обучения». arXiv : 2209.05433 [cs.LG].
  33. ^ Кахан, Уильям Мортон (11 января 2006 г.). «Насколько бесполезны бессмысленные оценки округления в вычислениях с плавающей запятой?» (PDF) . Архивировано (PDF) из оригинала 21 декабря 2004 г.
  34. ^ аб Гей, Дэвид М. (1990). Правильно округленные двоично-десятичные и десятично-двоичные преобразования (Технический отчет). РУКОВОДСТВО ПО ЧИСЛЕННОМУ АНАЛИЗУ 90-10, AT&T BELL LABORATORIES. CiteSeerX 10.1.1.31.4049 . (dtoa.c в netlab)
  35. ^ Лойч, Флориан (2010). «Быстрая и точная печать чисел с плавающей запятой с помощью целых чисел» (PDF) . Материалы 31-й конференции ACM SIGPLAN по проектированию и реализации языков программирования . PLDI '10: Конференция ACM SIGPLAN по разработке и реализации языков программирования. стр. 233–243. дои : 10.1145/1806596.1806623. ISBN 978-1-45030019-3. S2CID  910409. Архивировано (PDF) из оригинала 29 июля 2014 г.
  36. ^ «Добавлена ​​поддержка алгоритма Grisu3 для double.ToString(). от mazong1123 · Запрос на извлечение № 14646 · dotnet/coreclr» . Гитхаб .
  37. ^ Адамс, Ульф (2 декабря 2018 г.). «Рю: быстрое преобразование чисел с плавающей запятой в строку». Уведомления ACM SIGPLAN . 53 (4): 270–282. дои : 10.1145/3296979.3192369 . S2CID  218472153.
  38. ^ Джульетти, Рафаэлло. «Способ Шубфаха создавать двойники».
  39. ^ "аболз/Дракеннест". Гитхаб . 2022-11-10.
  40. ^ "Google/двойное преобразование" . Гитхаб . 21 сентября 2020 г.
  41. ^ Лемир, Дэниел (22 марта 2021 г.). «Разбор чисел со скоростью гигабайт в секунду». Программное обеспечение: практика и опыт . 51 (8): 1700–1727. arXiv : 2101.11408 . дои : 10.1002/сп.2984. S2CID  231718830.
  42. ^ abc Голдберг, Дэвид (март 1991 г.). «Что должен знать каждый ученый-компьютерщик об арифметике с плавающей запятой» (PDF) . Обзоры вычислительной техники ACM . 23 (1): 5–48. дои : 10.1145/103162.103163. S2CID  222008826. Архивировано (PDF) из оригинала 20 июля 2006 г. Проверено 20 января 2016 г.([2], [3], [4])
  43. ^ Паттерсон, Дэвид А.; Хеннесси, Джон Л. (2014). Компьютерная организация и проектирование, Аппаратно-программный интерфейс . Серия Моргана Кауфмана по компьютерной архитектуре и дизайну (5-е изд.). Уолтем, Массачусетс, США: Elsevier. п. 793. ИСБН 978-9-86605267-5.
  44. ^ ab Патент США 3037701A, Хуберто М. Сьерра, «Средство управления арифметикой с плавающей десятичной запятой для калькулятора», выдан 5 июня 1962 г. 
  45. ^ Аб Кахан, Уильям Мортон (1 октября 1997 г.). «Конспекты лекций о статусе стандарта IEEE 754 для двоичной арифметики с плавающей запятой» (PDF) . п. 9. Архивировано (PDF) из оригинала 22 июня 2002 г.
  46. ^ "Д.3.2.1". Руководства разработчиков программного обеспечения для архитектур Intel 64 и IA-32 . Том. 1.
  47. ^ Харрис, Ричард (октябрь 2010 г.). «Вам придется подумать!». Перегрузка (99): 5–10. ISSN  1354-3172 . Проверено 24 сентября 2011 г. Гораздо более тревожной является ошибка отмены, которая может привести к катастрофической потере точности.[5]
  48. ^ Кристофер Баркер: PEP 485 - Функция для проверки приблизительного равенства
  49. ^ «Противоракетная оборона Patriot. Проблема с программным обеспечением привела к сбою системы в Дхархане, Саудовская Аравия» . Счетная палата правительства США . Отчет GAO IMTEC 92-26.
  50. ^ Уилкинсон, Джеймс Харди (8 сентября 2003 г.). «Анализ ошибок». В Ралстоне, Энтони; Рейли, Эдвин Д.; Хеммендингер, Дэвид (ред.). Энциклопедия информатики. Уайли . стр. 669–674. ISBN 978-0-470-86412-8. Проверено 14 мая 2013 г.
  51. ^ Эйнарссон, Бо (2005). Точность и надежность в научных вычислениях. Общество промышленной и прикладной математики (SIAM). стр. 50–. ISBN 978-0-89871-815-7. Проверено 14 мая 2013 г.
  52. ^ abcd Higham, Николас Джон (2002). Точность и устойчивость численных алгоритмов (2-е изд.). Общество промышленной и прикладной математики (SIAM). стр. 27–28, 110–123, 493. ISBN. 978-0-89871-521-7. 0-89871-355-2.
  53. ^ Оливейра, Суэли; Стюарт, Дэвид Э. (7 сентября 2006 г.). Написание научного программного обеспечения: руководство по хорошему стилю. Издательство Кембриджского университета . стр. 10–. ISBN 978-1-139-45862-7.
  54. ^ Аб Кахан, Уильям Мортон (15 июля 2005 г.). Арифметика с плавающей запятой, осажденная «деловыми решениями» (PDF) . Симпозиум по компьютерной арифметике ARITH 17 , спонсируемый IEEE (основной доклад). стр. 6, 18. Архивировано (PDF) из оригинала 17 марта 2006 г. Проверено 23 мая 2013 г.(Примечание: по оценкам Кахана, частота чрезмерно неточных результатов вблизи сингулярностей снижается примерно в 1/2000 с использованием 11 дополнительных бит точности double расширенного .)
  55. ^ Кахан, Уильям Мортон (3 августа 2011 г.). Отчаянно необходимые средства устранения ошибок в больших вычислениях с плавающей запятой в науке и технике (PDF) . Рабочая конференция IFIP/SIAM/NIST по количественной оценке неопределенности в научных вычислениях, Боулдер, Колорадо, с. 33. Архивировано (PDF) из оригинала 20 июня 2013 г.
  56. ^ Кахан, Уильям Мортон ; Дарси, Джозеф (2001) [1998-03-01]. «Как числа с плавающей запятой в Java вредят всем и повсюду» (PDF) . Архивировано (PDF) из оригинала 16 августа 2000 г. Проверено 5 сентября 2003 г.
  57. ^ abcd Кахан, Уильям Мортон (27 августа 2000 г.). «Маркетинг против математики» (PDF) . стр. 15, 35, 47. Архивировано (PDF) из оригинала 15 августа 2003 г.
  58. ^ Кахан, Уильям Мортон (12 февраля 1981 г.). «Зачем нам нужен стандарт арифметики с плавающей запятой?» (PDF) . п. 26. Архивировано (PDF) из оригинала 4 декабря 2004 г.
  59. ^ Кахан, Уильям Мортон (4 июня 2001 г.). Биндель, Дэвид (ред.). «Конспекты лекций по системной поддержке научных вычислений» (PDF) . Архивировано (PDF) из оригинала 17 мая 2013 г.
  60. ^ «Общая десятичная арифметика». Speleotrove.com . Проверено 25 апреля 2012 г.
  61. ^ Кристиансен, Том; Торкингтон, Натан; и другие. (2006). «perlfaq4 / Почему int() не работает?». perldoc.perl.org . Проверено 11 января 2011 г.
  62. ^ Шевчук, Джонатан Ричард (1997). «Адаптивная точная арифметика с плавающей запятой и быстрые устойчивые геометрические предикаты». Дискретная и вычислительная геометрия . 18 (3): 305–363. дои : 10.1007/PL00009321 .
  63. ^ Кахан, Уильям Мортон ; Слоновая кость, Мелоди Ю. (3 июля 1997 г.). «Закругление ухудшает идеализированную кантилевер» (PDF) . Архивировано (PDF) из оригинала 5 декабря 2003 г.
  64. ^ «Автовекторизация в LLVM» . Документация LLVM 13 . Мы поддерживаем операции сокращения чисел с плавающей запятой при использовании -ffast-math.
  65. ^ "Математика с плавающей точкой". GCC Wiki .
  66. ^ «55522 - -funsafe-math-optimizations неожиданно вреден, особенно с -shared» . gcc.gnu.org .
  67. ^ «Параметры генерации кода (компилятор GNU Fortran)» . gcc.gnu.org .
  68. ^ «Ошибка в жеевде · Проблема № 43 · Справочник-LAPACK/lapack» . Гитхаб .
  69. ^ Беккер, Хейко; Дарулова, Ева; Мирин, Магнус О.; Тэтлок, Закари (2019). Icing: поддержка оптимизации стиля быстрой математики в проверенном компиляторе . CAV 2019: Компьютерная верификация. Том. 11562. стр. 155–173. дои : 10.1007/978-3-030-25543-5_10 .

дальнейшее чтение

Внешние ссылки