Арифметика с плавающей запятой
В вычислениях арифметика с плавающей запятой ( 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 секунды.
Представление с плавающей запятой по своей концепции аналогично научной записи. Логически число с плавающей запятой состоит из:
- Строка цифр со знаком (что означает положительную или отрицательную) заданной длины в заданном основании (или системе счисления ). Эта строка цифр называется мантиссой , мантиссой или коэффициентом . [номер 1] Длина мантиссы определяет точность представления чисел. Предполагается, что положение точки системы счисления всегда находится где-то внутри мантиссы - часто сразу после или непосредственно перед самой значимой цифрой или справа от самой правой (наименее значимой) цифры. В этой статье обычно следует соглашению, согласно которому точка системы счисления устанавливается сразу после самой значимой (крайней левой) цифры.
- Целочисленный показатель степени со знаком (также называемый характеристикой или масштабом ), [номер 2] который изменяет величину числа.
Чтобы получить значение числа с плавающей запятой, мантисса умножается на основание, возведенное в степень экспоненты , что эквивалентно сдвигу точки системы счисления из ее подразумеваемой позиции на количество мест, равное значению экспоненты - для вправо, если показатель степени положительный, или влево, если показатель степени отрицательный.
Используя систему счисления по основанию 10 (знакомое десятичное обозначение) в качестве примера, число 152 853,5047 , которое имеет точность десять десятичных цифр, представлено как мантисса 1 528 535 047 вместе с 5 в качестве показателя степени. Для определения фактического значения после первой цифры мантиссы ставится десятичная точка и результат умножается на 10. 5 чтобы дать 1,528535047 × 10 5 , или 152 853,5047 . При хранении такого числа нет необходимости сохранять базу (10), поскольку она будет одинаковой для всего диапазона поддерживаемых чисел и, таким образом, ее можно будет вывести.
Символически это окончательное значение равно:
где s — мантисса (без учета любой подразумеваемой десятичной точки), p — точность (количество цифр в мантиссе), b — основание (в нашем примере это число десять ), а e — показатель степени.
Исторически сложилось так, что для представления чисел с плавающей запятой использовалось несколько счислений, причем основание два ( двоичное наиболее распространенным является ), за которым следует основание десять ( десятичное с плавающей запятой ) и другие менее распространенные разновидности, такие как шестнадцатеричное ( шестнадцатеричное с плавающей запятой). [4] [5] [номер 3] ), основание восемь (восьмеричное с плавающей запятой [1] [5] [6] [4] [номер 4] ), по основанию четыре (четвертичная с плавающей запятой [7] [5] [номер 5] ), основание три ( сбалансированная троичная с плавающей запятой [1] ) и даже основание 256 [5] [номер 6] и основание 65 536 . [8] [номер 7]
Число с плавающей запятой является рациональным числом , поскольку его можно представить как одно целое число, разделенное на другое; например 1,45 × 10 3 составляет (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] или предполагаемое битовое соглашение .
Альтернативы числам с плавающей запятой [ править ]
Представление с плавающей запятой на сегодняшний день является наиболее распространенным способом представления в компьютерах приближения к действительным числам. Однако есть альтернативы:
- Представление с фиксированной запятой использует целочисленные аппаратные операции, управляемые программной реализацией определенного соглашения о расположении двоичной или десятичной точки, например, 6 бит или цифр справа. Аппаратное обеспечение для управления этими представлениями обходится дешевле, чем с плавающей запятой, и его также можно использовать для выполнения обычных целочисленных операций. Двоичная фиксированная точка обычно используется в приложениях специального назначения на встроенных процессорах, которые могут выполнять только целочисленные арифметические действия, но десятичная фиксированная точка распространена в коммерческих приложениях.
- Логарифмические системы счисления (LNS) представляют действительное число посредством логарифма его абсолютного значения и знакового бита. Распределение значений аналогично распределению с плавающей запятой, но кривая преобразования значения в представление ( т. е . график функции логарифма) является гладкой (за исключением нуля). В отличие от арифметики с плавающей запятой, в логарифмической системе счисления умножение, деление и возведение в степень реализовать просто, но сложение и вычитание сложны. ( Симметричная ) арифметика индекса уровня (LI и SLI) Чарльза Кленшоу, Фрэнка Олвера и Питера Тернера представляет собой схему, основанную на представлении обобщенного логарифма .
- Коническое представление с плавающей запятой , которое, похоже, не используется на практике.
- Некоторые простые рациональные числа ( например , 1/3 и 1/10) не могут быть точно представлены в двоичном виде с плавающей запятой, независимо от точности. Использование другой системы счисления позволяет представить некоторые из них ( например , 1/10 в десятичном формате с плавающей запятой), но возможности остаются ограниченными. Пакеты программного обеспечения, выполняющие рациональную арифметику, представляют числа в виде дробей с целыми числителем и знаменателем и, следовательно, могут точно представлять любое рациональное число. Такие пакеты обычно должны использовать арифметику bignum для отдельных целых чисел.
- Интервальная арифметика позволяет представлять числа в виде интервалов и получать гарантированные оценки результатов. Обычно он основан на другой арифметике, в частности с плавающей запятой.
- Системы компьютерной алгебры, такие как Mathematica , Maxima и Maple, часто могут обрабатывать иррациональные числа, такие как или совершенно «формальным» способом ( символическое вычисление ), не занимаясь конкретным кодированием мантиссы. Такая программа может оценивать выражения типа " Именно потому, что он запрограммирован на непосредственную обработку лежащих в основе математических вычислений вместо использования приблизительных значений для каждого промежуточного расчета.
История [ править ]
В 1914 году испанский инженер Леонардо Торрес Кеведо опубликовал «Очерки по автоматике» . [9] где он разработал специальный электромеханический калькулятор на основе Чарльза Бэббиджа и аналитической машины описал способ последовательного хранения чисел с плавающей запятой. Он заявил, что числа будут храниться в экспоненциальном формате как n x 10. и предложил три правила, с помощью которых можно было бы реализовать последовательное манипулирование машинами числами с плавающей запятой. По Торресу, « n всегда будет иметь одинаковое количество цифр (например, шесть), первая цифра n будет порядка десятых, вторая — сотых и т. д., и каждую величину можно будет записать в виде: n ; m. ." Предложенный им формат показывает необходимость мантиссы фиксированного размера, которая в настоящее время используется для данных с плавающей запятой, фиксации местоположения десятичной точки в мантиссе, чтобы каждое представление было уникальным, а также способов форматирования таких чисел путем указания синтаксиса. для использования, которые можно было ввести через пишущую машинку , как это было в случае с его электромеханическим арифмометром в 1920 году. [10] [11] [12]
В 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 . Арифметика на самом деле реализована программно, но при тактовой частоте в один мегагерц скорость операций с плавающей и фиксированной запятой в этой машине изначально была выше, чем у многих конкурирующих компьютеров.
серийный IBM 704 В 1954 году последовал ; он ввел использование смещенной экспоненты . В течение многих десятилетий после этого оборудование для вычислений с плавающей запятой обычно было необязательной функцией, а компьютеры, на которых оно было, назывались «научными компьютерами» или обладали возможностями « научных вычислений » (SC) (см. также Расширения для научных вычислений (XSC) )). Лишь после запуска Intel i486 в 1989 году персональные компьютеры общего назначения имели аппаратную поддержку операций с плавающей запятой в качестве стандартной функции.
Серия UNIVAC 1100/2200 , представленная в 1962 году, поддерживала два представления с плавающей запятой:
- Одинарная точность : 36 бит, организованные в виде 1-битного знака, 8-битной экспоненты и 27-битной мантиссы.
- Двойная точность : 72 бита, организованные в виде 1-битного знака, 11-битной экспоненты и 60-битной мантиссы.
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 ), где
- B – основа системы,
- P — точность мантиссы (в базе B ),
- L — наименьший показатель системы,
- U - наибольший показатель системы,
является .
Существует наименьшее положительное нормальное число с плавающей запятой,
- Уровень нижнего слива = UFL = ,
который имеет 1 в качестве первой цифры и 0 для остальных цифр мантиссы, а также наименьшее возможное значение показателя степени.
Существует наибольшее число с плавающей запятой,
- Уровень переполнения = ВЫКЛ = ,
который имеет B - 1 как значение для каждой цифры мантиссы и максимально возможное значение показателя степени.
Кроме того, существуют представимые значения строго между −UFL и UFL. А именно положительные и отрицательные нули , а также субнормальные числа .
: плавающая запятая в современных IEEE компьютерах 754
с плавающей запятой Форматы |
---|
ИЭЭЭ 754 |
|
Другой |
Альтернативы |
IEEE (он же IEC 60559) в 1985 году . стандартизировал компьютерное представление двоичных чисел с плавающей запятой в IEEE 754 Этому первому стандарту следуют почти все современные машины. Он был пересмотрен в 2008 году . Мэйнфреймы IBM поддерживают собственный шестнадцатеричный формат с плавающей запятой IBM и десятичный формат с плавающей запятой IEEE 754-2008 в дополнение к двоичному формату IEEE 754. Серия Cray T90 имела версию IEEE, но SV1 по-прежнему использует формат с плавающей запятой Cray. [ нужна ссылка ]
Стандарт предусматривает множество тесно связанных форматов, отличающихся лишь некоторыми деталями. Пять из этих форматов называются базовыми форматами , а остальные называются форматами расширенной точности и форматом расширяемой точности . В компьютерной технике и языках особенно широко используются три формата: [ нужна ссылка ]
- Одинарная точность (binary32), обычно используемая для представления типа «float» языков C. в семействе Это двоичный формат, который занимает 32 бита (4 байта), а его мантисса имеет точность 24 бита (около 7 десятичных цифр).
- Двойная точность (binary64), обычно используемая для представления типа «double» языков C. в семействе Это двоичный формат, который занимает 64 бита (8 байтов), а его мантисса имеет точность 53 бита (около 16 десятичных цифр).
- Double Extended , также неоднозначно называемый форматом «расширенной точности». Это двоичный формат, который занимает не менее 79 бит (80, если не используется правило скрытых/неявных битов), а его мантисса имеет точность не менее 64 бит (около 19 десятичных цифр). Стандарты C99 и C11 семейства языков C в приложении F («Арифметика с плавающей запятой IEC 60559») рекомендуют предоставлять такой расширенный формат как « long double ». [18] Формат, удовлетворяющий минимальным требованиям (64-битная точность значащего и значащего числа, 15-битная экспонента, что соответствует 80 битам), обеспечивается архитектурой x86 . Часто на таких процессорах этот формат можно использовать с «long double», хотя расширенная точность недоступна в MSVC. [19] В целях выравнивания многие инструменты сохраняют это 80-битное значение в 96-битном или 128-битном пространстве. [20] [21] На других процессорах «long double» может обозначать больший формат, например учетверенную точность, [22] или просто двойная точность, если какая-либо форма расширенной точности недоступна. [23]
Увеличение точности представления с плавающей запятой обычно уменьшает количество накопленных ошибок округления, вызванных промежуточными вычислениями. [24] Другие форматы IEEE включают:
- Decimal64 и decimal128 Форматы чисел с плавающей запятой . Эти форматы (особенно decimal128) широко распространены в финансовых транзакциях, поскольку, наряду с форматом decimal32 , они обеспечивают правильное округление десятичных дробей.
- Четверная точность (двоичная128). Это двоичный формат, который занимает 128 бит (16 байт), а его мантисса имеет точность 113 бит (около 34 десятичных цифр).
- Половинная точность , также называемая двоичным16, 16-битное значение с плавающей запятой. Он используется в графическом языке NVIDIA Cg и в стандарте openEXR (где он фактически предшествует появлению стандарта IEEE 754). [25] [26]
Любое целое число с абсолютным значением меньше 2 24 может быть точно представлено в формате одинарной точности, и любое целое число с абсолютным значением меньше 2 53 может быть точно представлено в формате двойной точности. Кроме того, может быть представлен широкий диапазон степеней, в 2 раза превышающих такое число. Эти свойства иногда используются для чисто целочисленных данных, чтобы получить 53-битные целые числа на платформах, которые имеют числа с плавающей запятой двойной точности, но только 32-битные целые числа.
Стандарт определяет некоторые специальные значения и их представление: положительную бесконечность ( +∞ ), отрицательную бесконечность ( −∞ ), отрицательный ноль (−0), отличный от обычного («положительного») нуля, и «нечисловые» значения ( NaN ).
Сравнение чисел с плавающей запятой, определенное стандартом IEEE, немного отличается от обычного сравнения целых чисел. Отрицательные и положительные нули сравниваются равными, а каждое NaN сравнивается с неравным каждому значению, включая само себя. Все конечные числа с плавающей запятой строго меньше +∞ и строго больше −∞ и упорядочены так же, как и их значения (во множестве действительных чисел).
Внутреннее представление [ править ]
Числа с плавающей запятой обычно упаковываются в компьютерные данные в виде бита знака, поля экспоненты и мантиссы или мантиссы слева направо. Для двоичных форматов IEEE 754 (базовых и расширенных), которые имеют существующие аппаратные реализации, они распределяются следующим образом:
Тип | Биты | Экспонента предвзятость |
Биты точность |
Количество десятичные цифры | ||||
---|---|---|---|---|---|---|---|---|
Знак | Экспонента | Значение | Общий | |||||
Половина ( IEEE 754-2008 ) | 1 | 5 | 10 | 16 | 15 | 11 | ~3.3 | |
Одинокий | 1 | 8 | 23 | 32 | 127 | 24 | ~7.2 | |
Двойной | 1 | 11 | 52 | 64 | 1023 | 53 | ~15.9 | |
повышенная точность x86 | 1 | 15 | 64 | 80 | 16383 | 64 | ~19.2 | |
Четырехместный | 1 | 15 | 112 | 128 | 16383 | 113 | ~34.0 |
Хотя показатель степени может быть положительным или отрицательным, в двоичных форматах он хранится как беззнаковое число, к которому добавлено фиксированное «смещение». Значения всех нулей в этом поле зарезервированы для нулей и субнормальных чисел ; значения всех единиц зарезервированы для бесконечностей и NaN. Диапазон экспоненты для обычных чисел составляет [-126, 127] для одинарной точности, [-1022, 1023] для двойной точности или [-16382, 16383] для четверной точности. Нормальные числа исключают субнормальные значения, нули, бесконечности и NaN.
В форматах двоичного обмена IEEE первый бит нормализованной мантиссы фактически не хранится в компьютерных данных. Его называют «скрытым» или «неявным» битом. Из-за этого формат одинарной точности фактически имеет мантиссу с точностью 24 бита, формат двойной точности — 53, а четырехзначный — 113.
Например, выше было показано, что π, округленное до 24 бит точности, имеет:
- знак = 0; е = 1; s = 110010010000111111011011 (включая скрытый бит)
Сумма смещения показателя (127) и показателя (1) равна 128, поэтому в формате одинарной точности это представляется как
- 0 10000000 10010010000111111011011 (исключая скрытый бит) = 40490FDB [27] как шестнадцатеричное число.
Пример макета для 32-битной плавающей запятой :
и 64-битная («двойная») раскладка аналогична.
запятой плавающей с Другие известные форматы
В дополнение к широко используемым стандартным форматам IEEE 754 , в определенных предметных областях используются или использовались другие форматы с плавающей запятой.
- Двоичный формат Microsoft (MBF) был разработан для языковых продуктов Microsoft BASIC, включая первый в истории продукт Microsoft Altair BASIC (1975), TRS-80 LEVEL II , от CP/M , MBASIC BASICA PC 5150 IBM от , MS- DOS для GW-BASIC и QuickBASIC до версии 4.00. QuickBASIC версий 4.00 и 4.50 переключен на формат IEEE 754-1985, но может вернуться к формату MBF с помощью параметра команды /MBF. MBF был спроектирован и разработан на моделируемом процессоре Intel 8080 Монте Давидоффом , соседом Билла Гейтса , весной 1975 года для MITS Altair 8800 . Первоначальный выпуск июля 1975 года поддерживал формат одинарной точности (32 бита) из-за стоимости 4-килобайтной памяти MITS Altair 8800 . В декабре 1975 года в 8-килобайтную версию был добавлен формат двойной точности (64 бита). Вариант формата с одинарной точностью (40 бит) был принят для других процессоров, в частности MOS 6502 ( Apple // , Commodore PET , Atari ), Motorola 6800 (MITS Altair 680) и Motorola 6809 ( цветной компьютер TRS-80 ). Все языковые продукты Microsoft с 1975 по 1987 год использовали Двоичный формат Microsoft до тех пор, пока Microsoft не приняла стандартный формат IEEE-754 во всех своих продуктах, начиная с 1988 года и до их текущих выпусков. MBF состоит из формата одинарной точности MBF (32 бита, «6-значный BASIC»), [28] [29] формат повышенной точности MBF (40 бит, «9-значный BASIC»), [29] и формат двойной точности MBF (64 бита); [28] [30] каждый из них представлен 8-битной экспонентой, за которой следует знаковый бит, за которым следует мантисса длиной 23, 31 и 55 бит соответственно.
- Формат Bfloat16 требует того же объема памяти (16 бит), что и формат половинной точности IEEE 754 , но для экспоненты выделяется 8 бит вместо 5, обеспечивая таким образом тот же диапазон, что и для числа одинарной точности IEEE 754 . Компромиссом является снижение точности, поскольку завершающее поле мантиссы уменьшается с 10 до 7 бит. Этот формат в основном используется при обучении моделей машинного обучения , где диапазон более ценен, чем точность. Многие ускорители машинного обучения обеспечивают аппаратную поддержку этого формата.
- ТензорФлоат-32 [31] Формат объединяет 8 бит показателя степени Bfloat16 с 10 битами конечного поля мантиссы форматов половинной точности, в результате чего получается размер 19 бит. Этот формат был представлен компанией Nvidia , которая обеспечивает его аппаратную поддержку в тензорных ядрах своих графических процессоров на базе архитектуры Nvidia Ampere. Недостатком этого формата является его размер, который не является степенью 2. Однако, по мнению Nvidia, этот формат должен использоваться только внутри оборудования для ускорения вычислений, а входные и выходные данные должны храниться в одном 32-битном формате. -прецизионный формат IEEE 754. [31]
- Графические процессоры с архитектурой Hopper поддерживают два формата FP8: один с тем же числовым диапазоном, что и половинная точность (E5M2), и другой с более высокой точностью, но меньшим диапазоном (E4M3). [32] [33]
Тип | Знак | Экспонента | Завершающее значимое поле | Всего бит |
---|---|---|---|---|
РП8 (Е4М3) | 1 | 4 | 3 | 8 |
ФП8 (Е5М2) | 1 | 5 | 2 | 8 |
Полуточность | 1 | 5 | 10 | 16 |
Бфлоат16 | 1 | 8 | 7 | 16 |
ТензорFloat-32 | 1 | 8 | 10 | 19 |
Одинарная точность | 1 | 8 | 23 | 32 |
Представленные числа, преобразование и округление [ править ]
По своей природе все числа, выраженные в формате с плавающей запятой, являются рациональными числами с завершающим расширением по соответствующему основанию (например, завершающим десятичным расширением по основанию 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 чаще используется метод по умолчанию ( округление до ближайшего значения, привязка к четному , иногда называемое банковским округлением). Этот метод округляет идеальный (бесконечно точный) результат арифметической операции до ближайшего представимого значения и выдает это представление в качестве результата. [номер 8] В случае ничьей выбирается значение, при котором мантисса оканчивается четной цифрой. Стандарт IEEE 754 требует, чтобы одно и то же округление применялось ко всем фундаментальным алгебраическим операциям, включая квадратный корень и преобразования, когда имеется числовой результат (не NaN). Это означает, что результаты операций IEEE 754 полностью определены во всех битах результата, за исключением представления NaN. («Библиотечные» функции, такие как косинус и журнал, не являются обязательными.)
Также доступны альтернативные варианты округления. IEEE 754 определяет следующие режимы округления:
- округление до ближайшего, где округление привязывается к ближайшей четной цифре в требуемой позиции (режим по умолчанию и, безусловно, наиболее распространенный режим)
- округление до ближайшего значения, где округление осуществляется от нуля (необязательно для двоичных чисел с плавающей запятой и обычно используется в десятичных числах)
- округлить в большую сторону (в сторону +∞; отрицательные результаты округляются в сторону нуля)
- округлить вниз (в сторону −∞; таким образом, отрицательные результаты округляются от нуля)
- округление к нулю (усечение; это похоже на обычное поведение преобразований чисел с плавающей точкой в целое число, которые преобразуют -3,9 в -3 и 3,9 в 3)
Альтернативные режимы полезны, когда количество вносимых ошибок должно быть ограничено. Приложениями, требующими ограниченной ошибки, являются операции с плавающей запятой различной точности и интервальная арифметика . Альтернативные режимы округления также полезны при диагностике числовой нестабильности: если результаты подпрограммы существенно различаются между округлением до + и - бесконечности, то она, вероятно, численно нестабильна и подвержена влиянию ошибки округления. [34]
Преобразование двоично-десятичного числа с минимальным количеством цифр [ править ]
Преобразование двоичного числа с плавающей запятой двойной точности в десятичную строку является обычной операцией, но алгоритм, дающий одновременно точные и минимальные результаты, не появлялся в печати до 1990 года, когда Стил и Уайт разработали Dragon4. Некоторые из улучшений с тех пор включают в себя:
- Дэвида М. Гэя dtoa.c — практическая реализация многих идей Dragon4 с открытым исходным кодом. [35]
- Grisu3 с ускорением в 4 раза, поскольку исключает использование bignums . Необходимо использовать с запасным вариантом, так как он не работает примерно в 0,5% случаев. [36]
- Errol3, всегда успешный алгоритм, похожий на Grisu3, но более медленный. Очевидно, не так хорошо, как Грису с ранним завершением и откатом. [37]
- Ryū, всегда успешный алгоритм, который быстрее и проще Grisu3. [38]
- Schubfach, всегда успешный алгоритм, основанный на идее, похожей на Ryū, был разработан почти одновременно и независимо. [39] В некоторых тестах работает лучше, чем Рю и Грису3. [40]
Многие современные языковые среды выполнения используют Grisu3 с запасным вариантом Dragon4. [41]
Преобразование десятичной системы в двоичную [ править ]
Проблема преобразования десятичной строки в двоичное представление FP сложна: точный анализатор не появился до работы Клингера 1990 года (реализованной в dtoa.c). [35] Дальнейшая работа также продвинулась в направлении более быстрого синтаксического анализа. [42]
Операции с плавающей запятой [ править ]
Для простоты представления и понимания десятичная система счисления в примерах будет использоваться с точностью до 7 цифр, как в формате IEEE 754 decimal32 . Фундаментальные принципы одинаковы для любой системы счисления и точности, за исключением того, что нормализация не является обязательной (она не влияет на числовое значение результата). Здесь s обозначает мантиссу, а e обозначает показатель степени.
Сложение и вычитание [ править ]
Простой метод сложения чисел с плавающей запятой — сначала представить их с одинаковым показателем степени. В приведенном ниже примере второе число сдвигается вправо на три цифры, а затем выполняется обычный метод сложения:
123456.7 = 1.234567 × 10^5 101.7654 = 1.017654 × 10^2 = 0.001017654 × 10^5
Hence: 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
Подробно:
e=5; s=1.234567 (123456.7) + e=2; s=1.017654 (101.7654)
e=5; s=1.234567 + e=5; s=0.001017654 (after shifting) -------------------- e=5; s=1.235584654 (true sum: 123558.4654)
Это истинный результат, точная сумма операндов. Оно будет округлено до семи цифр, а затем при необходимости нормализовано. Конечный результат
e=5; s=1.235585 (final sum: 123558.5)
Младшие три цифры второго операнда (654) по существу теряются. Это ошибка округления . В крайнем случае сумма двух ненулевых чисел может быть равна одному из них:
e=5; s=1.234567 + e=−3; s=9.876543
e=5; s=1.234567 + e=5; s=0.00000009876543 (after shifting) ---------------------- e=5; s=1.23456709876543 (true sum) e=5; s=1.234567 (after rounding and normalization)
В приведенных выше концептуальных примерах может показаться, что сумматору потребуется ввести большое количество дополнительных цифр, чтобы обеспечить правильное округление; однако для двоичного сложения или вычитания с использованием осторожных методов реализации необходимо перенести только защитный бит, бит округления и один дополнительный липкий бит за пределы точности операндов. [43] [44] : 218–220
Другая проблема потери значимости возникает, когда приближения вычитаются к двум почти равным числам. В следующем примере e = 5; s = 1,234571 и е = 5; s = 1,234567 являются приближениями к рациональным числам 123457,1467 и 123456,659.
e=5; s=1.234571 − e=5; s=1.234567 ---------------- e=5; s=0.000004 e=−1; s=4.000000 (after rounding and normalization)
Разница с плавающей запятой вычисляется именно потому, что числа близки — лемма Штербенца гарантирует это даже в случае опустошения, когда постепенное опустошение поддерживается . Несмотря на это, разность исходных чисел равна e = −1; s = 4,877000, что более чем на 20% отличается от разницы e = −1; s = 4,000000 приближений. В крайних случаях все значащие цифры точности могут быть потеряны. [43] [45] Это сокращение иллюстрирует опасность предположения, что все цифры вычисленного результата имеют смысл. Устранение последствий этих ошибок является темой численного анализа ; см. также Проблемы с точностью .
Умножение и деление [ править ]
При умножении мантиссы умножаются, а показатели степени складываются, а результат округляется и нормализуется.
e=3; s=4.734612 × e=5; s=5.417242 ----------------------- e=8; s=25.648538980104 (true product) e=8; s=25.64854 (after rounding) e=9; s=2.564854 (after normalization)
Точно так же деление осуществляется путем вычитания показателя делителя из показателя делимого и деления мантиссы делимого на мантиссу делителя.
При умножении или делении не возникает проблем со списанием или поглощением, хотя небольшие ошибки могут накапливаться при последовательном выполнении операций. [43] На практике способ выполнения этих операций в цифровой логике может быть довольно сложным (см. Алгоритм умножения Бута и Алгоритм деления ). [номер 9] Чтобы узнать о быстром и простом методе, см. метод Хорнера .
Литеральный синтаксис [ править ]
Литералы для чисел с плавающей запятой зависят от языка. Обычно они используют e
или E
для обозначения научных обозначений . Язык программирования C и стандарт IEEE 754 также определяют синтаксис шестнадцатеричных литералов с показателем степени по основанию 2 вместо 10. В таких языках, как C , когда десятичный показатель опущен, десятичная точка необходима, чтобы отличить их от целых чисел. Другие языки не имеют целочисленных типов (например, JavaScript ) или допускают перегрузку числовых типов (например, Haskell ). В этих случаях строки цифр, такие как 123
также могут быть литералами с плавающей запятой.
Примеры литералов с плавающей запятой:
99.9
-5000.12
6.02e23
-3e-45
0x1.fffffep+127
в C и IEEE 754
Работа с исключительными случаями [ править ]
Вычисления с плавающей запятой в компьютере могут столкнуться с тремя видами проблем:
- Операция может быть математически неопределенной, например ∞/∞ или деление на ноль .
- Операция может быть допустимой в принципе, но не поддерживаться конкретным форматом, например, вычисление квадратного корня из −1 или обратного синуса 2 (оба из которых приводят к получению комплексных чисел ).
- В принципе операция может быть допустимой, но результат может быть невозможно представить в указанном формате, поскольку показатель степени слишком велик или слишком мал для кодирования в поле показателя. Такое событие называется переполнением (слишком большой показатель степени), недостатком (слишком малый показатель степени) или денормализацией (потеря точности).
До появления стандарта IEEE такие условия обычно приводили к завершению работы программы или запускали какую-то ловушку , которую программист мог поймать. То, как это работало, зависело от системы, а это означало, что программы с плавающей запятой не были переносимыми . (Термин «исключение», используемый в IEEE 754, является общим термином, означающим исключительное состояние, которое не обязательно является ошибкой, и его использование отличается от того, которое обычно определяется в таких языках программирования, как C++ или Java, в которых « « исключение » — это альтернативный поток управления, близкий к тому, что в терминологии IEEE 754 называется «ловушкой».)
Здесь обсуждается требуемый метод обработки исключений по умолчанию в соответствии со стандартом IEEE 754 (дополнительный режим перехвата исключений IEEE 754 и другие режимы «альтернативной обработки исключений» не обсуждаются). Арифметические исключения (по умолчанию) должны записываться в «фиксированные» биты флага состояния. То, что они «прикреплены», означает, что они не сбрасываются следующей (арифметической) операцией, а остаются установленными до тех пор, пока не будут явно сброшены. Таким образом, использование «липких» флагов позволяет отложить тестирование исключительных условий до тех пор, пока не будет выполнено полное выражение или подпрограмма с плавающей запятой: без них исключительные условия, которые иначе нельзя было бы игнорировать, потребовали бы явного тестирования сразу после каждой операции с плавающей запятой. По умолчанию операция всегда возвращает результат в соответствии со спецификацией, не прерывая вычислений. Например, 1/0 возвращает +∞, а также устанавливает бит флага деления на ноль (это значение по умолчанию, равное ∞, предназначено для того, чтобы часто возвращать конечный результат при использовании в последующих операциях, поэтому его можно безопасно игнорировать).
Однако исходный стандарт IEEE 754 не рекомендовал операции для обработки таких наборов битов флагов арифметических исключений. Таким образом, хотя они были реализованы аппаратно, изначально реализации языков программирования обычно не предоставляли средств доступа к ним (кроме ассемблера). Со временем некоторые стандарты языков программирования (например, C99 /C11 и Fortran) были обновлены, чтобы определить методы доступа и изменения битов флага состояния. Версия стандарта IEEE 754 2008 года теперь определяет несколько операций для доступа и обработки битов арифметических флагов. Модель программирования основана на одном потоке выполнения, и их использование несколькими потоками должно обрабатываться средствами, выходящими за рамки стандарта (например, C11 указывает, что флаги имеют локальное хранилище потока ).
IEEE 754 определяет пять арифметических исключений, которые должны быть записаны во флагах состояния («липкие биты»):
- inexact , устанавливается, если округленное (и возвращаемое) значение отличается от математически точного результата операции.
- underflow , устанавливается, если округленное значение маленькое (как указано в IEEE 754) и неточное (или, возможно, ограничено, если оно имеет потери на денормализацию, согласно версии IEEE 754 1985 года), возвращая ненормальное значение, включая нули.
- overflow , устанавливается, если абсолютное значение округленного значения слишком велико для представления. Возвращается бесконечность или максимальное конечное значение, в зависимости от того, какое округление используется.
- деление на ноль , устанавливается, если результат бесконечен с учетом конечных операндов, возвращает бесконечность, либо +∞, либо −∞.
- недопустимый , устанавливается, если результат с действительным знаком не может быть возвращен, например, sqrt(-1) или 0/0, возвращающий тихое NaN.
Возвращаемое значение по умолчанию для каждого исключения предназначено для получения правильного результата в большинстве случаев, поэтому исключения можно игнорировать в большинстве кодов. inexact возвращает правильно округленный результат, а underflow возвращает значение, меньшее или равное наименьшему положительному нормальному числу по величине, и его почти всегда можно игнорировать. [46] деление на ноль возвращает точно бесконечность, которая обычно затем делит конечное число и, таким образом, дает ноль, или в противном случае впоследствии выдает недопустимое исключение, и поэтому его также обычно можно игнорировать. Например, эффективное сопротивление n резисторов, включенных параллельно (см. рис. 1), определяется выражением . Если возникло короткое замыкание с установить на 0, вернет +бесконечность, что даст финал 0, как и ожидалось [47] (Другой пример см. в примере с непрерывной дробью в обосновании конструкции IEEE 754 ).
Исключения переполнения и недопустимые исключения обычно нельзя игнорировать, но они не обязательно представляют собой ошибки: например, процедура поиска корня в рамках своей обычной работы может оценивать переданную функцию со значениями за пределами ее домена, возвращая NaN и недопустимый флаг исключения , который следует игнорировать до тех пор, пока не будет найдена полезная отправная точка. [46]
Проблемы с точностью [ править ]
Тот факт, что числа с плавающей запятой не могут точно представлять все действительные числа, а операции с плавающей запятой не могут точно представлять истинные арифметические операции, приводит ко многим удивительным ситуациям. Это связано с конечной точностью , с которой компьютеры обычно представляют числа.
Например, десятичные числа 0,1 и 0,01 не могут быть представлены точно как двоичные числа с плавающей запятой. В формате IEEE 754binary32 с его 24-битным мантиссом результат попытки возвести в квадрат приближение к 0,1 не является ни 0,01, ни ближайшим к нему представимым числом. Десятичное число 0,1 представлено в двоичном виде как e = −4 ; s = 110011001100110011001101 , что
Возведение этого числа в квадрат дает
Возведение его в квадрат с округлением до 24-битной точности дает
Но представимое число, ближайшее к 0,01, равно
Кроме того, непредставимость π (и π/2) означает, что попытка вычисления tan(π/2) не даст бесконечного результата и даже не переполнится в обычных форматах с плавающей запятой (при условии точного вычисления). реализация загара). Для стандартного оборудования с плавающей запятой просто невозможно попытаться вычислить tan(π/2), поскольку π/2 не может быть представлено точно. Это вычисление в C:
/* Enough digits to be sure we get the correct approximation. */
double pi = 3.1415926535897932384626433832795;
double z = tan(pi/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-значную десятичную арифметику:
a = 1234.567, b = 45.67834, c = 0.0004
(a + b) + c: 1234.567 (a) + 45.67834 (b) ____________ 1280.24534 rounds to 1280.245
1280.245 (a + b) + 0.0004 (c) ____________ 1280.2454 rounds to 1280.245 ← (a + b) + c
a + (b + c): 45.67834 (b) + 0.0004 (c) ____________ 45.67874
1234.567 (a) + 45.67874 (b + c) ____________ 1280.24574 rounds to 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 but 1234.567 + 1.234567 = 1235.802 1235.802 × 3.333333 = 4119.340
Помимо потери значимости, невозможности точного представления таких чисел, как π и 0,1, а также других небольших неточностей, могут возникнуть следующие явления:
- Отмена : вычитание почти равных операндов может привести к значительной потере точности. [48] [45] Когда мы вычитаем два почти равных числа, мы устанавливаем самые значащие цифры равными нулю, оставляя себе только незначащие и наиболее ошибочные цифры. [1] : 124 Например, при определении производной функции используется следующая формула:
Интуитивно хотелось бы, чтобы h был очень близок к нулю; однако при использовании операций с плавающей запятой наименьшее число не даст наилучшего приближения производной. По мере того как h становится меньше, разница между f ( a + h ) и f ( a ) становится меньше, исключая наиболее значимые и наименее ошибочные цифры и делая наиболее ошибочные цифры более важными. В результате наименьшее возможное число h даст более ошибочное приближение производной, чем несколько большее число. Это, пожалуй, самая распространенная и серьезная проблема с точностью.
- Преобразование в целое число не интуитивно понятно: преобразование (63,0/9,0) в целое число дает 7, но преобразование (0,63/0,09) может дать 6. Это связано с тем, что преобразования обычно усекаются, а не округляются. Функции пола и потолка могут давать ответы, отличающиеся на единицу от интуитивно ожидаемого значения.
- Ограниченный диапазон экспоненты: результаты могут переполняться, приводя к бесконечности, или уменьшаться, приводя к субнормальному числу или нулю. В этих случаях точность будет потеряна.
- Проверка безопасного деления проблематична: проверка того, что делитель не равен нулю, не гарантирует, что деление не переполнится.
- Проверка на равенство проблематична. Две математически равные вычислительные последовательности вполне могут давать разные значения с плавающей запятой. [49]
Инциденты [ править ]
- 25 февраля 1991 года потеря значимости MIM -104 «Патриот» ракетной батареи помешала ей перехватить приближающуюся ракету «Скад» в Дахране , Саудовская Аравия армии США , что привело к гибели 28 солдат из 14-го квартирмейстерского отряда . [50]
Точность станка и обратный анализ ошибок
Машинная точность — это величина, которая характеризует точность системы с плавающей запятой и используется при обратном анализе ошибок алгоритмов с плавающей запятой. Он также известен как единичное округление или машинный эпсилон . Обычно обозначается Ε мах , его значение зависит от конкретного используемого округления.
С округлением до нуля
Это важно, поскольку оно ограничивает относительную ошибку представления любого ненулевого действительного числа x в нормализованном диапазоне системы с плавающей запятой:
Обратный анализ ошибок, теория которого была разработана и популяризирована Джеймсом Х. Уилкинсоном , может использоваться для установления того, что алгоритм, реализующий числовую функцию, численно устойчив. [51] Основной подход состоит в том, чтобы показать, что, хотя вычисленный результат из-за ошибок округления не будет абсолютно правильным, он является точным решением соседней задачи со слегка искаженными входными данными. Если требуемое возмущение невелико, порядка неопределенности входных данных, то результаты в некотором смысле настолько точны, насколько «заслуживают» данные. Тогда алгоритм определяется как обратно стабильный . Стабильность — это мера чувствительности к ошибкам округления данной числовой процедуры; напротив, число обусловленности функции для данной проблемы указывает на внутреннюю чувствительность функции к небольшим возмущениям на ее входных данных и не зависит от реализации, используемой для решения проблемы. [52]
В качестве тривиального примера рассмотрим простое выражение, дающее скалярное произведение векторов (длины два) и , затем
где
где
по определению, которая представляет собой сумму двух слегка возмущенных (порядка Емах ) входных данных и поэтому является обратно устойчивой. Более реалистичные примеры числовой линейной алгебры см. Higham 2002. [53] и другие ссылки ниже.
влияния проблем точностью Минимизация с
Хотя отдельные арифметические операции IEEE 754 гарантированы с точностью до половины ULP , более сложные формулы могут содержать более крупные ошибки по ряду причин. Потеря точности может быть существенной, если задача или ее данные плохо обусловлены , а это означает, что правильный результат сверхчувствителен к малейшим отклонениям в данных. Однако даже хорошо обусловленные функции могут пострадать от большой потери точности, если алгоритм, численно нестабильный используется для этих данных: очевидно эквивалентные формулировки выражений на языке программирования могут заметно отличаться по своей числовой устойчивости. Одним из подходов к устранению риска такой потери точности является разработка и анализ численно устойчивых алгоритмов, что является целью раздела математики, известного как численный анализ . Другой подход, который может защитить от риска числовых нестабильностей, — это вычисление промежуточных (царапающих) значений в алгоритме с более высокой точностью, чем требует конечный результат. [54] которые могут устранить или уменьшить на порядки величину, [55] такой риск: стандарты IEEE 754 с учетверенной точностью и расширенной точностью . для этой цели при вычислениях с двойной точностью предназначены [56] [номер 11]
Например, следующий алгоритм представляет собой прямую реализацию вычисления функции A ( x ) = ( x −1) / (exp( x −1) − 1) , которая хорошо обусловлена при 1,0, [номер 12] однако можно показать, что он численно нестабильен и теряет до половины значащих цифр, содержащихся в арифметике, при вычислении около 1,0. [57]
double A(double X)
{
double Y, Z; // [1]
Y = X - 1.0;
Z = exp(Y);
if (Z != 1.0)
Z = Y / (Z - 1.0); // [2]
return Z;
}
Однако если все промежуточные вычисления выполняются с повышенной точностью (например, путем установки для строки [1] значения C99 long double
), то можно сохранить полную точность конечного двойного результата. [номер 13] Альтернативно, численный анализ алгоритма показывает, что если в строку [2] внести следующее неочевидное изменение:
Z = log(Z) / (Z - 1.0);
тогда алгоритм становится численно стабильным и может выполнять вычисления с полной двойной точностью.
Чтобы сохранить свойства таких тщательно построенных численно стабильных программ, осторожное обращение со стороны компилятора требуется . Определенные «оптимизации», которые могут сделать компиляторы (например, изменение порядка операций), могут противоречить целям обеспечения хорошего поведения программного обеспечения. Существуют некоторые разногласия по поводу недостатков компиляторов и конструкции языка в этой области: C99 является примером языка, в котором такие оптимизации тщательно определены для поддержания числовой точности. См. внешние ссылки внизу этой статьи.
Подробное рассмотрение методов написания высококачественного программного обеспечения для операций с плавающей запятой выходит за рамки этой статьи, и мы отсылаем читателя к: [53] [58] и другие ссылки внизу этой статьи. Кахан предлагает несколько практических правил, которые можно существенно уменьшить на порядки. [58] риск числовых аномалий в дополнение или вместо более тщательного численного анализа. К ним относятся: как отмечалось выше, вычисление всех выражений и промежуточных результатов с высочайшей точностью, поддерживаемой аппаратным обеспечением (общее практическое правило состоит в том, чтобы иметь двойную точность желаемого результата, т.е. вычислять с двойной точностью для окончательного результата с одинарной точностью); или с двойной расширенной или учетверенной точностью для получения результатов с двойной точностью [59] ); и округление входных данных и результатов только до точности, требуемой и поддерживаемой входными данными (избыточная точность конечного результата, превышающая требуемую и поддерживаемую входными данными, может вводить в заблуждение, увеличивает стоимость хранения и снижает скорость, а лишние биты могут влияют на сходимость численных процедур: [60] в частности, первая форма итерационного примера, приведенного ниже, сходится правильно при использовании этого эмпирического правила). Далее следуют краткие описания нескольких дополнительных проблем и методов.
Поскольку десятичные дроби часто невозможно точно представить в двоичном формате с плавающей запятой, такая арифметика лучше всего работает, когда ее просто используют для измерения реальных величин в широком диапазоне масштабов (например, периода обращения Луны вокруг Сатурна). или масса протона ) , и в худшем случае, когда ожидается моделирование взаимодействия величин, выраженных в виде десятичных строк, которые должны быть точными. [55] [58] Примером последнего случая являются финансовые расчеты. По этой причине финансовое программное обеспечение, как правило, не использует представление двоичных чисел с плавающей запятой. [61] Тип данных «десятичный» языков программирования C# и Python , а также десятичные форматы стандарта IEEE 754-2008 разработаны для того, чтобы избежать проблем, связанных с двоичными представлениями с плавающей запятой при применении к введенным человеком точным десятичным значениям, и сделать арифметика всегда ведет себя так, как ожидалось, когда числа печатаются в десятичном формате.
Ожидания математики могут не оправдаться в области вычислений с плавающей запятой. Например, известно, что , и это , однако на эти факты нельзя полагаться, если рассматриваемые величины являются результатом вычислений с плавающей запятой.
Использование критерия равенства ( if (x==y) ...
) требует осторожности при работе с числами с плавающей запятой. Даже простые выражения, такие как 0.6/0.2-3==0
на большинстве компьютеров не будет правдой [62] (например, в стандарте двойной точности IEEE 754: 0.6/0.2 - 3
примерно равно -4,44089209850063e-16). Следовательно, такие тесты иногда заменяются «нечеткими» сравнениями ( if (abs(x-y) < epsilon) ...
, где эпсилон достаточно мал и адаптирован к приложению, например 1.0E-13). Разумность этого сильно различается и может потребовать численного анализа для определения эпсилона. [53] Значения, полученные на основе представления первичных данных, и их сравнения должны выполняться с более широкой и расширенной точностью, чтобы свести к минимуму риск таких несоответствий из-за ошибок округления. [58] Зачастую лучше организовать код таким образом, чтобы такие тесты были ненужны. Например, в вычислительной геометрии точные проверки того, находится ли точка вне линии или плоскости, определяемой другими точками, или находятся на ней, могут быть выполнены с использованием методов адаптивной точности или точной арифметики. [63]
Небольшие ошибки в арифметике с плавающей запятой могут вырасти, когда математические алгоритмы выполняют операции огромное количество раз. Несколько примеров: инверсия матрицы , вычисление собственных векторов и решение дифференциальных уравнений. необходимо разрабатывать очень тщательно с использованием численных подходов, таких как итеративное уточнение . Чтобы эти алгоритмы работали хорошо, их [64]
Суммирование вектора значений с плавающей запятой является основным алгоритмом в научных вычислениях , поэтому понимание того, когда может произойти потеря значимости, имеет важное значение. Например, если складывать очень большое количество чисел, отдельные слагаемые будут очень малы по сравнению с суммой. Это может привести к потере значимости. Типичным дополнением будет что-то вроде
3253.671 + 3.141276 ----------- 3256.812
Младшие 3 цифры слагаемых фактически теряются. Предположим, например, что нужно сложить много чисел, все примерно равных 3. После сложения 1000 из них текущая сумма составит около 3000; потерянные цифры не восстанавливаются. алгоритм суммирования Кахана . Для уменьшения ошибок можно использовать [53]
Ошибка округления может повлиять на сходимость и точность итерационных численных процедур. Например, Архимед аппроксимировал число π, вычислив периметры многоугольников, вписывающих и описывающих круг, начиная с шестиугольников и последовательно удваивая количество сторон. Как отмечалось выше, вычисления можно перестроить таким образом, чтобы это было математически эквивалентно, но менее подвержено ошибкам ( числовой анализ ). Две формы рекуррентной формулы для описанного многоугольника: [ нужна ссылка ]
- Первая форма:
- вторая форма:
- , сходящиеся как
Вот вычисление с использованием «двойной» арифметики IEEE (мантисса с точностью 53 бита):
i 6 × 2i × ti, first form 6 × 2i × ti, second form --------------------------------------------------------- 0 3.4641016151377543863 3.4641016151377543863 1 3.2153903091734710173 3.2153903091734723496 2 3.1596599420974940120 3.1596599420975006733 3 3.1460862151314012979 3.1460862151314352708 4 3.1427145996453136334 3.1427145996453689225 5 3.1418730499801259536 3.1418730499798241950 6 3.1416627470548084133 3.1416627470568494473 7 3.1416101765997805905 3.1416101766046906629 8 3.1415970343230776862 3.1415970343215275928 9 3.1415937488171150615 3.1415937487713536668 10 3.1415929278733740748 3.1415929273850979885 11 3.1415927256228504127 3.1415927220386148377 12 3.1415926717412858693 3.1415926707019992125 13 3.1415926189011456060 3.1415926578678454728 14 3.1415926717412858693 3.1415926546593073709 15 3.1415919358822321783 3.1415926538571730119 16 3.1415926717412858693 3.1415926536566394222 17 3.1415810075796233302 3.1415926536065061913 18 3.1415926717412858693 3.1415926535939728836 19 3.1414061547378810956 3.1415926535908393901 20 3.1405434924008406305 3.1415926535900560168 21 3.1400068646912273617 3.1415926535898608396 22 3.1349453756585929919 3.1415926535898122118 23 3.1400068646912273617 3.1415926535897995552 24 3.2245152435345525443 3.1415926535897968907 25 3.1415926535897962246 26 3.1415926535897962246 27 3.1415926535897962246 28 3.1415926535897962246 The true value is 3.14159265358979323846264338327...
Хотя две формы рекуррентной формулы явно математически эквивалентны, [номер 14] первый вычитает 1 из числа, чрезвычайно близкого к 1, что приводит к все более проблематичной потере значащих цифр . Поскольку повторение применяется неоднократно, точность сначала улучшается, но затем ухудшается. Оно никогда не становится лучше, чем примерно 8 цифр, даже несмотря на то, что 53-битная арифметика должна обеспечивать точность около 16 цифр. Когда используется вторая форма повторения, значение сходится к точности 15 цифр.
Оптимизация «Быстрая математика» [ править ]
Вышеупомянутое отсутствие ассоциативности операций с плавающей запятой в целом означает, что компиляторы не могут переупорядочивать арифметические выражения так же эффективно, как при целочисленной арифметике и арифметике с фиксированной запятой, что представляет собой препятствие для таких оптимизаций, как исключение общих подвыражений и авто- векторизация . [65] Опция «быстрая математика» во многих компиляторах (ICC, GCC, Clang, MSVC...) включает повторную ассоциацию вместе с небезопасными предположениями, такими как отсутствие NaN и бесконечных чисел в IEEE 754. Некоторые компиляторы также предлагают более детальные параметры только для включи реассоциацию. В любом случае программист сталкивается со многими ошибками точности, упомянутыми выше, в части программы, использующей «быстрые» математические вычисления. [66]
В некоторых компиляторах (GCC и Clang) включение «быстрых» математических вычислений может привести к тому, что программа отключит ненормальные числа с плавающей запятой при запуске, влияя на поведение с плавающей запятой не только сгенерированного кода, но и любой программы, использующей такой код в качестве библиотеки . [67]
В большинстве компиляторов Фортрана , как это разрешено стандартом Фортрана ISO/IEC 1539-1:2004, повторное связывание используется по умолчанию, при этом поломка в значительной степени предотвращается с помощью настройки «защитить круглые скобки» (также включенной по умолчанию). Этот параметр не позволяет компилятору повторно связываться за пределами круглых скобок. [68] Компилятор Intel Fortran является заметным исключением. [69]
Распространенной проблемой в «быстрой» математике является то, что подвыражения не могут быть одинаково оптимизированы от места к месту, что приводит к неожиданным различиям. Одна из интерпретаций проблемы заключается в том, что «быстрая» математика в ее нынешнем виде имеет плохо определенную семантику. Одна из попыток формализовать «быстрые» математические оптимизации можно увидеть в Icing . проверенном компиляторе [70]
См. также [ править ]
- Арифметика произвольной точности
- C99 для примеров кода, демонстрирующих доступ и использование функций IEEE 754.
- Вычислимое число
- Сопроцессор
- Десятичная с плавающей запятой
- Двойная точность
- Экспериментальная математика – использует высокоточные вычисления с плавающей запятой.
- Арифметика с фиксированной запятой
- Устранение ошибок с плавающей запятой
- ФЛОПС
- Точные таблицы Гала
- ГНУ МПФР
- Формат с плавающей запятой половинной точности
- IEEE 754 - Стандарт двоичной арифметики с плавающей запятой
- Архитектура IBM с плавающей запятой
- Алгоритм суммирования Кахана
- Бинарный формат Microsoft (MBF)
- Минипоплавок
- Q (числовой формат) для постоянного разрешения
- Формат чисел с плавающей запятой четырехкратной точности (включая double-double).
- Значительные цифры
- Формат с плавающей запятой одинарной точности
Примечания [ править ]
- ↑ также называют мантиссу числа с плавающей запятой с — не путать мантиссой логарифма Некоторые авторы . несколько расплывчатые термины, такие как коэффициент или аргумент Некоторые также используют . Использование термина «доля» некоторыми авторами также потенциально вводит в заблуждение. Термин «характеристика» (используемый, например, CDC ) неоднозначен, поскольку исторически он также использовался для указания некоторой формы показателя степени чисел с плавающей запятой.
- ^ Показатель степени числа с плавающей запятой иногда также называют масштабом . Термин «характеристика» (для смещенной экспоненты , смещения экспоненты или представления избыточного n ) неоднозначен, поскольку исторически он также использовался для указания мантиссы чисел с плавающей запятой.
- ^ Шестнадцатеричная (основание 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).
- ^ Восьмеричная арифметика с плавающей запятой (основание 8) используется в компьютерах Ferranti Atlas (1962), Burroughs B5500 (1964), Burroughs B5700 (1971), Burroughs B6700 (1971) и Burroughs B7700 (1972).
- ^ Четвертичная арифметика с плавающей запятой (основание 4) используется в компьютере Illinois ILLIAC II (1962). Он также используется в системах съемки местности с высоким разрешением Digital Field System DFS IV и V.
- ^ Арифметика с плавающей запятой по основанию 256 используется в компьютере R1 Института Райса (с 1958 года).
- ^ Арифметика с плавающей запятой Base-65536 используется в компьютере MANIAC II (1956).
- ^ Компьютерное оборудование не обязательно вычисляет точное значение; он просто должен выдать эквивалентный округленный результат, как если бы он вычислил бесконечно точный результат.
- ^ Огромная сложность современных алгоритмов деления однажды привела к известной ошибке. Ранняя версия процессора Intel Pentium поставлялась с инструкцией деления , которая в редких случаях давала слегка неправильные результаты. Многие компьютеры были отправлены до того, как ошибка была обнаружена. Пока неисправные компьютеры не были заменены, разрабатывались исправленные версии компиляторов, позволяющие избежать случаев сбоя. См. ошибку Pentium FDIV .
- ^ Но попытка вычисления cos(π) дает ровно −1. Поскольку производная близка к нулю вблизи π, влияние неточности аргумента намного меньше, чем расстояние между числами с плавающей запятой вокруг −1, и округленный результат является точным.
- ^ Уильям Кахан отмечает: «За исключением крайне редких ситуаций, сверхточная арифметика обычно снижает риски, связанные с округлением, при гораздо меньших затратах, чем цена компетентного аналитика ошибок».
- ^ Разложение Тейлора этой функции показывает, что она хорошо обусловлена вблизи 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| < π.
- ^ Если long double соответствует четырехзначной точности IEEE , то сохраняется полная двойная точность; если long double — это расширенная двойная точность IEEE , то сохраняется дополнительная, но не полная точность.
- ^ Эквивалентность двух форм можно проверить алгебраически, заметив, что знаменатель дроби во второй форме является сопряженным к числителю первой. Умножив верхнюю и нижнюю часть первого выражения на это сопряженное, можно получить второе выражение.
Ссылки [ править ]
- ^ Jump up to: а б с д и ж Мюллер, Жан-Мишель; Бризебар, Николя; из Динешена, Флоран; Жаннерод, Клод-Пьер; Лефевр, Винсент; Мелькионд, Гийом; Револь, Натали ; Стеле, Дэмиен; Торрес, Серж (2010). Справочник по арифметике с плавающей запятой (1-е изд.). Биркхойзер . дои : 10.1007/978-0-8176-4705-6 . ISBN 978-0-8176-4704-9 . LCCN 2009939668 .
- ^ Jump up to: а б Стербенс, Пэт Х. (1974). Вычисление с плавающей запятой . Энглвуд Клиффс, Нью-Джерси, США: Прентис-Холл. ISBN 0-13-322495-3 .
- ^ Смит, Стивен В. (1997). «Глава 28, Фиксированная и плавающая точка» . Руководство для ученых и инженеров по цифровой обработке сигналов . Калифорнийский технический паб. п. 514. ИСБН 978-0-9660176-3-2 . Проверено 31 декабря 2012 г.
- ^ Jump up to: а б Зеенднер, Эберхард (лето 2008 г.). «Rechnerarithmetik: Fest- und Gleitkommasysteme» (PDF) (сценарий лекции) (на немецком языке). Йенский университет имени Фридриха Шиллера . п. 2. Архивировано (PDF) из оригинала 7 августа 2018 г. Проверено 7 августа 2018 г. [1] (Примечание. В этой ссылке неверно указано число с плавающей запятой MANIAC II как 256, тогда как на самом деле оно равно 65536.)
- ^ Jump up to: а б с д Биб, Нельсон ХФ (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 .
- ^ Савард, Джон Дж. Г. (2018) [2007], «Стандарт десятичных чисел с плавающей запятой» , четырехблок , заархивировано из оригинала 03 июля 2018 г. , получено 16 июля 2018 г.
- ^ Паркинсон, Роджер (7 декабря 2000 г.). «Глава 2 – Цифровые системы съемки местности высокого разрешения – Глава 2.1 – Цифровые системы полевой регистрации» . Обследования объектов с высоким разрешением (1-е изд.). ЦРК Пресс . п. 24. ISBN 978-0-20318604-6 . Проверено 18 августа 2019 г.
[…] Такие системы, как [Цифровая полевая система] DFS IV и DFS V, представляли собой четверичные системы с плавающей запятой и использовали шаг усиления 12 дБ. […]
(256 страниц) - ^ Лазарус, Роджер Б. (30 января 1957 г.) [1 октября 1956 г.]. «МАНИАК II» (PDF) . Лос-Аламос, Нью-Мексико, США: Лос-Аламосская научная лаборатория Калифорнийского университета. п. 14. ЛА-2083. Архивировано (PDF) из оригинала 7 августа 2018 г. Проверено 7 августа 2018 г.
[…] плавбаза Маньяка, а это 2 16 = 65 536. […] Большая база Маньяка позволяет значительно увеличить скорость арифметических операций с плавающей запятой. Хотя такая большая база предполагает возможность использования до 15 ведущих нулей, большой размер слова в 48 бит гарантирует адекватную значимость. […]
- ^ Торрес Кеведо, Леонардо. Автомат: Дополнение к теории машин, (pdf) , стр. 575–583, Журнал общественных работ, 19 ноября 1914 г.
- ^ Рональд Т. Кнезель. Числа и компьютеры , Springer, стр. 84–85, 2017 г. ISBN 978-3319505084
- ^ Рэнделл 1982 , стр. 6, 11–13.
- ^ Рэнделл, Брайан. Цифровые компьютеры, История происхождения, (pdf) , с. 545, Цифровые компьютеры: происхождение, Энциклопедия информатики, январь 2003 г.
- ^ Рохас, Рауль (апрель – июнь 1997 г.). «Наследие Конрада Цузе: архитектура Z1 и Z3» (PDF) . IEEE Анналы истории вычислений . 19 (2): 5–16. дои : 10.1109/85.586067 . Архивировано (PDF) из оригинала 3 июля 2022 г. Проверено 3 июля 2022 г. (12 страниц)
- ^ Рохас, Рауль (07.06.2014). «Z1: Архитектура и алгоритмы первого компьютера Конрада Цузе». arXiv : 1406.1886 [ cs.AR ].
- ^ Jump up to: а б Кахан, Уильям Мортон (15 июля 1997 г.). «Пагубное влияние компьютерных языков и тестов на прикладную математику, физику и химию. Лекция Джона фон Неймана» (PDF) . п. 3. Архивировано (PDF) из оригинала 5 сентября 2008 г.
- ^ Рэнделл, Брайан , изд. (1982) [1973]. Истоки цифровых компьютеров: избранные статьи (3-е изд.). Берлин; Нью-Йорк: Springer-Verlag . п. 244. ИСБН 978-3-540-11319-5 .
- ^ Северанс, Чарльз (20 февраля 1998 г.). «Интервью со стариком, занимающимся плавающей запятой» .
- ^ ISO/IEC 9899:1999 – Языки программирования – C. Исо.орг. §F.2, примечание 307.
«Расширенный» — это двойной расширенный формат данных IEC 60559. Расширенный относится как к обычному 80-битному, так и к четырехкратному 128-битному формату IEC 60559.
- ^ «Представление IEEE с плавающей запятой» . 03.08.2021.
- ^ Использование коллекции компиляторов GNU, параметры i386 и x86-64, заархивировано 16 января 2015 г. на Wayback Machine .
- ^ "long double (специфично для GCC) и __float128" . StackOverflow .
- ^ «Стандарт вызова процедур для 64-битной архитектуры ARM (AArch64)» (PDF) . 22 мая 2013 г. Архивировано (PDF) из оригинала 31 июля 2013 г. Проверено 22 сентября 2019 г.
- ^ «Справочник по компилятору набора инструментов ARM Compiler, версия 5.03» (PDF) . 2013. Раздел 6.3 Основные типы данных . Архивировано (PDF) из оригинала 27 июня 2015 г. Проверено 08.11.2019 .
- ^ Кахан, Уильям Мортон (20 ноября 2004 г.). «О стоимости вычислений с плавающей запятой без сверхточной арифметики» (PDF) . Архивировано (PDF) из оригинала 25 мая 2006 г. Проверено 19 февраля 2012 г.
- ^ «опенЭКСР» . открытьEXR. Архивировано из оригинала 8 мая 2013 г. Проверено 25 апреля 2012 г.
Поскольку спецификация IEEE-754 для чисел с плавающей запятой не определяет 16-битный формат, ILM создала «половинный» формат. Половинные значения имеют 1 бит знака, 5 битов экспоненты и 10 битов мантиссы.
- ^ «Техническое введение в OpenEXR — половинный тип данных» . открытьEXR . Проверено 16 апреля 2024 г.
- ^ «Анализ IEEE-754» .
- ^ Jump up to: а б Сотрудники 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; […]
- ^ Jump up to: а б Стейл, Майкл (20 октября 2008 г.). «Создайте свою собственную версию Microsoft BASIC для 6502» . pagetable.com. Архивировано из оригинала 30 мая 2016 г. Проверено 30 мая 2016 г.
- ^ «IEEE против двоичного формата Microsoft; проблемы округления (завершено)» . Поддержка Майкрософт . Майкрософт . 21 ноября 2006 г. Идентификатор статьи KB35826, Q35826. Архивировано из оригинала 28 августа 2020 г. Проверено 24 февраля 2010 г.
- ^ Jump up to: а б Харья, Пареш (14 мая 2020 г.). «TensorFloat-32 в графическом процессоре A100 ускоряет обучение ИИ, HPC до 20 раз» . Проверено 16 мая 2020 г.
- ^ «Подробное описание архитектуры NVIDIA Hopper» . 2022-03-22.
- ^ Мицикявичюс, Паулюс; Стосич, Душан; Берджесс, Нил; Роговица, Мариус; Дубей, Прадип; Гризентуэйт, Ричард; Ха, Санвон; Хайнеке, Александр; Джадд, Патрик; Камалу, Джон; Меллемпуди, Навин; Оберман, Стюарт; Шойби, Мохаммед; Сиу, Майкл; Ву, Хао (12 сентября 2022 г.). «Форматы FP8 для глубокого обучения». arXiv : 2209.05433 [ cs.LG ].
- ^ Кахан, Уильям Мортон (11 января 2006 г.). «Насколько бесполезны бессмысленные оценки округления в вычислениях с плавающей запятой?» (PDF) . Архивировано (PDF) из оригинала 21 декабря 2004 г.
- ^ Jump up to: а б Гей, Дэвид М. (1990). Правильно округленные двоично-десятичные и десятично-двоичные преобразования (Технический отчет). РУКОВОДСТВО ПО ЧИСЛЕННОМУ АНАЛИЗУ 90-10, AT&T BELL LABORATORIES. CiteSeerX 10.1.1.31.4049 . ( dtoa.c в netlab )
- ^ Лойч, Флориан (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 г.
- ^ «Добавлена поддержка алгоритма Grisu3 для double.ToString(). автор mazong1123 · Pull Request #14646 · dotnet/coreclr» . Гитхаб .
- ^ Адамс, Ульф (2 декабря 2018 г.). «Рю: быстрое преобразование чисел с плавающей запятой в строку» . Уведомления ACM SIGPLAN . 53 (4): 270–282. дои : 10.1145/3296979.3192369 . S2CID 218472153 .
- ^ Джульетти, Рафаэлло. «Способ Schubfach для рендеринга двойников» .
- ^ "аболз/Дракеннест" . Гитхаб . 2022-11-10.
- ^ «Google/двойная конверсия» . Гитхаб . 21 сентября 2020 г.
- ^ Лемир, Дэниел (22 марта 2021 г.). «Разбор чисел со скоростью гигабайт в секунду». Программное обеспечение: практика и опыт . 51 (8): 1700–1727. arXiv : 2101.11408 . дои : 10.1002/спе.2984 . S2CID 231718830 .
- ^ Jump up to: а б с Гольдберг, Дэвид (март 1991 г.). «Что должен знать каждый ученый-компьютерщик об арифметике с плавающей запятой» (PDF) . Обзоры вычислительной техники ACM . 23 (1): 5–48. дои : 10.1145/103162.103163 . S2CID 222008826 . Архивировано (PDF) из оригинала 20 июля 2006 г. Проверено 20 января 2016 г. ( [2] , [3] , [4] Архивировано 11 октября 2017 г. в Wayback Machine )
- ^ Паттерсон, Дэвид А.; Хеннесси, Джон Л. (2014). Компьютерная организация и проектирование, Аппаратно-программный интерфейс . Серия Моргана Кауфмана по компьютерной архитектуре и дизайну (5-е изд.). Уолтем, Массачусетс, США: Elsevier. п. 793. ИСБН 978-9-86605267-5 .
- ^ Jump up to: а б Патент США 3037701A , Хуберто М. Сьерра, «Средство управления арифметическими операциями с плавающей десятичной запятой для калькулятора», выдан 5 июня 1962 г.
- ^ Jump up to: а б Кахан, Уильям Мортон (1 октября 1997 г.). «Конспекты лекций о статусе стандарта IEEE 754 для двоичной арифметики с плавающей запятой» (PDF) . п. 9. Архивировано (PDF) из оригинала 22 июня 2002 г.
- ^ «Д.3.2.1» . Руководства разработчиков программного обеспечения для архитектур Intel 64 и IA-32 . Том. 1.
- ^ Харрис, Ричард (октябрь 2010 г.). «Вам придется подумать!» . Перегрузка (99): 5–10. ISSN 1354-3172 . Проверено 24 сентября 2011 г.
Гораздо более тревожной является ошибка отмены, которая может привести к катастрофической потере точности.
[5] - ^ Кристофер Баркер: PEP 485 - Функция для проверки приблизительного равенства
- ^ «Проблема противоракетной обороны Patriot. Проблема с программным обеспечением привела к сбою системы в Дхархане, Саудовская Аравия» . Счетная палата правительства США . Отчет GAO IMTEC 92-26.
- ^ Уилкинсон, Джеймс Харди (8 сентября 2003 г.). «Анализ ошибок». В Ралстоне, Энтони; Рейли, Эдвин Д.; Хеммендингер, Дэвид (ред.). Энциклопедия информатики . Уайли . стр. 669–674. ISBN 978-0-470-86412-8 . Проверено 14 мая 2013 г.
- ^ Эйнарссон, Бо (2005). Точность и надежность в научных вычислениях . Общество промышленной и прикладной математики (SIAM). стр. 50–. ISBN 978-0-89871-815-7 . Проверено 14 мая 2013 г.
- ^ Jump up to: а б с д Хайэм, Николас Джон (2002). Точность и устойчивость численных алгоритмов (2-е изд.). Общество промышленной и прикладной математики (SIAM). стр. 27–28, 110–123, 493. ISBN. 978-0-89871-521-7 . 0-89871-355-2.
- ^ Оливейра, Суэли; Стюарт, Дэвид Э. (7 сентября 2006 г.). Написание научного программного обеспечения: руководство по хорошему стилю . Издательство Кембриджского университета . стр. 10–. ISBN 978-1-139-45862-7 .
- ^ Jump up to: а б Кахан, Уильям Мортон (15 июля 2005 г.). Арифметика с плавающей запятой, осажденная «деловыми решениями» (PDF) . , спонсируемый IEEE Симпозиум по компьютерной арифметике ARITH 17 (основной доклад). стр. 6, 18. Архивировано (PDF) из оригинала 17 марта 2006 г. Проверено 23 мая 2013 г. (Примечание. По оценкам Кахана, частота чрезмерно неточных результатов вблизи сингулярностей снижается примерно в 1/2000 с использованием 11 дополнительных бит точности double Extended .)
- ^ Кахан, Уильям Мортон (3 августа 2011 г.). Отчаянно необходимые средства устранения ошибок в больших вычислениях с плавающей запятой в науке и технике (PDF) . Рабочая конференция IFIP/SIAM/NIST по количественной оценке неопределенности в научных вычислениях, Боулдер, Колорадо, с. 33. Архивировано (PDF) из оригинала 20 июня 2013 г.
- ^ Кахан, Уильям Мортон ; Дарси, Джозеф (2001) [1998-03-01]. «Как числа с плавающей запятой в Java вредят всем и повсюду» (PDF) . Архивировано (PDF) из оригинала 16 августа 2000 г. Проверено 5 сентября 2003 г.
- ^ Jump up to: а б с д Кахан, Уильям Мортон (27 августа 2000 г.). «Маркетинг против математики» (PDF) . стр. 15, 35, 47. Архивировано (PDF) из оригинала 15 августа 2003 г.
- ^ Кахан, Уильям Мортон (12 февраля 1981 г.). «Зачем нам нужен стандарт арифметики с плавающей запятой?» (PDF) . п. 26. Архивировано (PDF) из оригинала 4 декабря 2004 г.
- ^ Кахан, Уильям Мортон (4 июня 2001 г.). Биндель, Дэвид (ред.). «Конспекты лекций по системной поддержке научных вычислений» (PDF) . Архивировано (PDF) из оригинала 17 мая 2013 г.
- ^ «Общая десятичная арифметика» . Speleotrove.com . Проверено 25 апреля 2012 г.
- ^ Кристиансен, Том; Торкингтон, Натан; и др. (2006). "perlfaq4 / Почему int() не работает?" . perldoc.perl.org . Проверено 11 января 2011 г.
- ^ Шевчук, Джонатан Ричард (1997). «Адаптивная точная арифметика с плавающей запятой и быстрые устойчивые геометрические предикаты» . Дискретная и вычислительная геометрия . 18 (3): 305–363. дои : 10.1007/PL00009321 .
- ^ Кахан, Уильям Мортон ; Слоновая кость, Мелоди Ю. (3 июля 1997 г.). «Закругление ухудшает идеализированную кантилевер» (PDF) . Архивировано (PDF) из оригинала 5 декабря 2003 г.
- ^ «Автовекторизация в LLVM» . Документация LLVM 13 .
Мы поддерживаем операции сокращения чисел с плавающей запятой при использовании -ffast-math.
- ^ «Математика с плавающей точкой» . GCC Wiki .
- ^ «55522 – -funsafe-math-optimizations неожиданно вреден, особенно с -shared» . gcc.gnu.org .
- ^ «Параметры генерации кода (компилятор GNU Fortran)» . gcc.gnu.org .
- ^ «Ошибка в жеевде · Проблема № 43 · Справочник-LAPACK/lapack» . Гитхаб .
- ^ Беккер, Хейко; Дарулова, Ева; Мирин, Магнус О.; Тэтлок, Закари (2019). Icing: поддержка оптимизации стиля быстрой математики в проверенном компиляторе . CAV 2019: Компьютерная верификация. Том. 11562. стр. 155–173. дои : 10.1007/978-3-030-25543-5_10 .
Дальнейшее чтение [ править ]
- Уилкинсон, Джеймс Харди (1963). Ошибки округления в алгебраических процессах (1-е изд.). Энглвуд Клиффс, Нью-Джерси, США: Prentice-Hall, Inc. ISBN 9780486679990 . МР 0161456 . (Примечание. Классические влиятельные трактаты по арифметике с плавающей запятой.)
- Уилкинсон, Джеймс Харди (1965). Алгебраическая проблема собственных значений . Монографии по численному анализу (1-е изд.). Издательство Оксфордского университета / Clarendon Press . ISBN 9780198534037 . Проверено 11 февраля 2016 г.
- Стербенс, Пэт Х. (1974). Вычисление с плавающей запятой . Серия Прентис-Холла по автоматическим вычислениям (1-е изд.). Энглвуд Клиффс, Нью-Джерси, США: Прентис Холл . ISBN 978-0-13-322495-5 .
- Голуб, Джин Ф.; ван Лоан, Чарльз Ф. (1986). Матричные вычисления (3-е изд.). Издательство Университета Джонса Хопкинса . ISBN 978-0-8018-5413-2 .
- Пресс, Уильям Генри ; Теукольский, Саул А. ; Веттерлинг, Уильям Т .; Фланнери, Брайан П. (2007) [1986]. Численные рецепты - Искусство научных вычислений (3-е изд.). Издательство Кембриджского университета . ISBN 978-0-521-88407-5 . (Примечание. Издание с компакт-диском с исходным кодом.)
- Кнут, Дональд Эрвин (1997). «Раздел 4.2: Арифметика с плавающей запятой». Искусство компьютерного программирования , Том. 2: Получисловые алгоритмы (3-е изд.). Аддисон-Уэсли . стр. 214–264. ISBN 978-0-201-89684-8 .
- Блаау, Геррит Энн ; Брукс-младший, Фредерик Филлипс (1997). Компьютерная архитектура: концепции и эволюция (1-е изд.). Аддисон-Уэсли . ISBN 0-201-10557-8 . (1213 страниц) (Примечание. Это однотомное издание. Работа также доступна в двухтомном варианте.)
- Савард, Джон Дж. Г. (2018) [2005], «Форматы с плавающей запятой» , четырехблок , заархивировано из оригинала 03 июля 2018 г. , получено 16 июля 2018 г.
- Мюллер, Жан-Мишель; Бруни, Николас; де Динешен, Флоран; Жаннерод, Клод-Пьер; Джолдес, Миоара; Лефевр, Винсент; Мелькионд, Гийом; Револь, Натали ; Торрес, Серж (2018) [2010]. Справочник по арифметике с плавающей запятой (2-е изд.). Биркхойзер . дои : 10.1007/978-3-319-76526-6 . ISBN 978-3-319-76525-9 . LCCN 2018935254 .
Внешние ссылки [ править ]
- «Обзор форматов с плавающей запятой» . (Примечание. На этой странице представлен очень краткий обзор форматов с плавающей запятой, которые использовались на протяжении многих лет.)
- Моннио, Дэвид (май 2008 г.). «Подводные камни проверки вычислений с плавающей запятой» . Транзакции ACM в языках и системах программирования . 30 (3). Транзакции Ассоциации вычислительной техники (ACM) по языкам и системам программирования (TOPLAS): 1–41. arXiv : cs/0701192 . дои : 10.1145/1353445.1353446 . S2CID 218578808 . (Примечание. Краткое описание неинтуитивного поведения операций с плавающей запятой в популярных архитектурах, имеющее значение для проверки и тестирования программ.)
- Открытые ядра . (Примечание. Этот веб-сайт содержит IP-ядра с плавающей запятой с открытым исходным кодом для реализации операторов с плавающей запятой в устройствах FPGA или ASIC. Проект double_fpu содержит исходный код Verilog для модуля с плавающей запятой двойной точности. Проект fpuvhdl содержит исходный код VHDL код модуля одинарной точности с плавающей запятой.)
- Флигал, Эрик (2004). «Оптимизация Microsoft Visual C++ с плавающей запятой» . MSDN .