Из Википедии, бесплатной энциклопедии
  (Перенаправлено с плавающей точки )
Перейти к навигации Перейти к поиску

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

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

где значение - целое число , основание - целое число, большее или равное двум, а показатель степени также является целым числом. Например:

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

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

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

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

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

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

Обзор [ править ]

Числа с плавающей запятой [ править ]

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

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

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

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

  • Знаковая (то есть положительная или отрицательная) строка цифр заданной длины с заданным основанием (или основанием ). Эта цифра строка называется мантисса , мантиссы , или коэффициент . [nb 1] Длина мантиссы определяет точность, с которой могут быть представлены числа. Предполагается, что положение точки системы счисления всегда находится где-то в пределах мантиссы - часто сразу после или непосредственно перед самой значащей цифрой или справа от самой правой (наименее значащей) цифры. В этой статье обычно следует соглашение, согласно которому точка счисления устанавливается сразу после самой значащей (самой левой) цифры.
  • Целочисленный показатель степени со знаком (также называемый характеристикой или шкалой ), [nb 2], который изменяет величину числа.

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

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

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

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

Исторически сложилось так, что для представления чисел с плавающей запятой использовалось несколько оснований счисления, причем основание два ( двоичное ) было наиболее распространенным, за ним следовало основание десять ( десятичное число с плавающей запятой ) и другие менее распространенные варианты, такие как основание шестнадцать ( шестнадцатеричное число с плавающей запятой). [2] [3] [nb 3] ), основание восемь (восьмеричное число с плавающей запятой [4] [3] [5] [2] [nb 4] ) », основание четыре (четвертичное число с плавающей запятой [6] [3] [nb 5] ), основание три ( сбалансированное троичное число с плавающей запятой [4] ) и четное основание 256 [3] [nb 6] и основание65 536 . [7] [№ 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 . Следовательно, его не нужно представлять в памяти; позволяя формату иметь еще один бит точности. Это правило по- разному называют ведущим бит конвенции , то неявное бит конвенции , то скрытый бит конвенции , [4] или предполагаемый бит конвенции .

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

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

  • В представлении с фиксированной точкой используются целочисленные аппаратные операции, управляемые программной реализацией определенного соглашения о расположении двоичной или десятичной точки, например, 6 битов или цифр справа. Аппаратное обеспечение для управления этими представлениями менее затратно, чем с плавающей запятой, и его также можно использовать для выполнения обычных целочисленных операций. Двоичная фиксированная точка обычно используется в специализированных приложениях на встроенных процессорах, которые могут выполнять только целочисленную арифметику, но десятичная фиксированная точка является обычным явлением в коммерческих приложениях.
  • Логарифмические системы счисления (LNS) представляют действительное число логарифмом его абсолютного значения и знаковым битом. Распределение значений аналогично распределению с плавающей запятой, но кривая значения для представления ( т. Е. График функции логарифма) гладкая (за исключением 0). В отличие от арифметики с плавающей запятой, в логарифмической системе счисления умножение, деление и возведение в степень просты в реализации, но сложение и вычитание сложны. ( Симметричная ) арифметика индекса уровня (LI и SLI) Чарльза Кленшоу, Фрэнка Олвера и Питера Тернера - это схема, основанная на представлении обобщенного логарифма .
  • Коническое представление с плавающей запятой , которое, похоже, не используется на практике.
  • Там, где требуется более высокая точность, может быть реализована арифметика с плавающей запятой (обычно в программном обеспечении) с величинами переменной длины (а иногда и показателями), размер которых зависит от реальной потребности и в зависимости от того, как выполняются вычисления. Это называется арифметикой произвольной точности с плавающей запятой.
  • Расширения с плавающей запятой - еще один способ получить большую точность, используя оборудование с плавающей запятой: число представлено как неоцененная сумма нескольких чисел с плавающей запятой. Пример является двойным двойным арифметическим , иногда используется для типа C long double.
  • Некоторые простые рациональные числа ( например , 1/3 и 1/10) не могут быть представлены точно в двоичном формате с плавающей запятой, независимо от точности. Использование другой системы счисления позволяет представить некоторые из них ( например , 1/10 в десятичной системе счисления с плавающей запятой), но возможности остаются ограниченными. Программные пакеты, которые выполняют рациональную арифметику, представляют числа как дроби с целым числителем и знаменателем и, следовательно, могут точно представлять любое рациональное число. Такие пакеты, как правило, должны использовать арифметику " bignum " для отдельных целых чисел.
  • Интервальная арифметика позволяет представлять числа в виде интервалов и получать гарантированные оценки результатов. Обычно он основан на другой арифметике, в частности на плавающей запятой.
  • Системы компьютерной алгебры, такие как Mathematica , Maxima и Maple, часто могут обрабатывать иррациональные числа как или полностью «формальным» способом, не имея дело с конкретным кодированием значения. Такая программа может точно оценивать такие выражения, как " ", потому что она запрограммирована для непосредственной обработки лежащих в основе математики, вместо использования приблизительных значений для каждого промежуточного вычисления.

История [ править ]

В 1914 году Леонардо Торрес Кеведо у разработал электромеханическую версию Чарльза Бэббиджа «s Analytical Engine , и включал арифметику с плавающей точкой. [8] В 1938 году Конрад Цузе из Берлина завершил разработку Z1 , первого двоичного программируемого механического компьютера ; [9] он использует 24-битное двоичное представление числа с плавающей запятой с 7-битовой экспонентой со знаком, 17-битной мантиссой (включая один неявный бит) и знаковым битом. [10] Более надежный Z3 на базе реле., завершенный в 1941 году, имеет представления как для положительной, так и для отрицательной бесконечности; в частности, он реализует определенные операции с бесконечностью, такие как , и останавливается на неопределенных операциях, таких как .

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

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

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

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

В 1954 году последовал серийный IBM 704 ; он ввел использование смещенной экспоненты . В течение многих десятилетий после этого аппаратное обеспечение с плавающей запятой было, как правило, дополнительной функцией, и компьютеры, на которых оно было установлено, назывались «научными компьютерами» или имели возможность « научных вычислений » (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 году математик и ученый-компьютерщик Уильям Кахан был удостоен премии Тьюринга как главный архитектор этого предложения; ему помогали его ученик (Джером Кунен) и приглашенный профессор (Гарольд Стоун). [13]

Среди нововведений 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 для остальных цифр мантиссы и наименьшее возможное значение для экспоненты.

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

Уровень перелива = OFL = ,

который имеет 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 с плавающей запятой. [ необходима цитата ]

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

  • Одинарная точность (binary32), обычно используется для представления типа "float" в семействе языков C (хотя это не гарантируется ). Это двоичный формат, занимающий 32 бита (4 байта), а его значение имеет точность 24 бита (около 7 десятичных цифр).
  • Двойная точность (binary64), обычно используется для представления типа «double» в семействе языков C (хотя это не гарантируется ). Это двоичный формат, занимающий 64 бита (8 байтов), а его значение имеет точность 53 бита (около 16 десятичных цифр).
  • Двойной расширенный , также неоднозначно называемый форматом «расширенной точности». Это двоичный формат, который занимает не менее 79 бит (80, если правило скрытых / неявных битов не используется), а его значение имеет точность не менее 64 бит (около 19 десятичных цифр). Стандарты C99 и C11 семейства языков C в своем приложении F («Арифметика с плавающей запятой IEC 60559») рекомендуют использовать такой расширенный формат как « long double ». [14] Формат, удовлетворяющий минимальным требованиям (64-битная точность значащей, 15-битная экспонента, таким образом умещается на 80 битах), предоставляется x86.архитектура. Часто на таких процессорах этот формат может использоваться с «длинным двойным», хотя расширенная точность недоступна для MSVC. Для целей выравнивания многие инструменты хранят это 80-битное значение в 96-битном или 128-битном пространстве. [15] [16] На других процессорах «long double» может означать более крупный формат, такой как учетверенная точность, [17] или просто двойная точность, если какая-либо форма повышенной точности недоступна. [18]

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

  • Четверная точность (binary128). Это двоичный формат, занимающий 128 бит (16 байтов), а его значение имеет точность 113 бит (около 34 десятичных цифр).
  • Decimal64 и decimal128 форматы с плавающей запятой. Эти форматы, наряду с форматом decimal32 , предназначены для правильного округления десятичных дробей .
  • Половинная точность , также называемая binary16, 16-битное значение с плавающей запятой. Он используется в графическом языке NVIDIA Cg и в стандарте openEXR. [20]

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

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

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

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

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

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

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

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

  • знак = 0; е = 1; s = 110010010000111111011011 (включая скрытый бит)

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

  • 0 10000000 10010010000111111011011 (без скрытого бита) = 40490FDB [21] в виде шестнадцатеричного числа.

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

и 64-битная компоновка аналогична .

Особые значения [ править ]

Подписанный ноль [ править ]

В стандарте IEEE 754 ноль имеет знак, что означает, что существует как «положительный ноль» (+0), так и «отрицательный ноль» (-0). В большинстве сред выполнения положительный ноль обычно печатается как " 0", а отрицательный ноль как " -0". Эти два значения ведут себя как равные при численных сравнениях, но некоторые операции возвращают разные результаты для +0 и -0. Например, 1 / (- 0) возвращает отрицательную бесконечность, а 1 / + 0 возвращает положительную бесконечность (так что тождество 1 / (1 / ± ∞) = ± ∞ сохраняется). Другие общие функции с разрывом при x = 0, которые могут трактовать +0 и −0 по-разному, включают log ( x ), signum ( x ),и главный квадратный кореньот у + хх для любого отрицательного числа у . Как и в любой схеме аппроксимации, операции с «отрицательным нулем» могут иногда вызывать путаницу. Например, в IEEE 754 x = y не всегда означает 1 / x = 1 / y , так как 0 = −0, но 1/0 ≠ 1 / −0 . [22]

Субнормальные числа [ править ]

Субнормальные значения заполняют промежуток потери значимости значениями, абсолютное расстояние между которыми такое же, как и для соседних значений сразу за промежутком потери значимости. Это усовершенствование по сравнению со старой практикой, заключающейся в том, что в промежутке потери значимости только ноль, а результаты с отсутствием заполнения были заменены на ноль (сбрасывание до нуля). [4]

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

Бесконечности [ править ]

Бесконечности расширенной строки действительных чисел могут быть представлены в типах данных с плавающей запятой IEEE, точно так же, как обычные значения с плавающей запятой, такие как 1, 1,5 и т. Д. Они никоим образом не являются значениями ошибок, хотя они часто (но не всегда, поскольку это зависит от округления) используется в качестве значений замены при переполнении. При исключении деления на ноль в качестве точного результата возвращается положительная или отрицательная бесконечность. Бесконечность также может быть введена как числовое число (например, макрос "INFINITY" в языке C или "∞", если язык программирования допускает такой синтаксис).

IEEE 754 требует разумной обработки бесконечностей, например

  • (+ ∞) + (+7) = (+ ∞)
  • (+ ∞) × (−2) = (−∞)
  • (+ ∞) × 0 = NaN - нет смысла делать

NaN [ править ]

IEEE 754 определяет специальное значение, называемое «Not a Number» (NaN), которое должно быть возвращено в результате определенных «недопустимых» операций, таких как 0/0, ∞ × 0 или sqrt (-1). В общем, NaN будут распространяться, т.е. большинство операций с NaN приведут к NaN, хотя функции, которые дадут определенный результат для любого заданного значения с плавающей запятой, будут делать то же самое и для NaN, например, NaN ^ 0 = 1. Есть два типа NaN: тихие NaN по умолчанию и, необязательно, сигнальные NaN. Сигнализация NaN в любой арифметической операции (включая численные сравнения) вызовет выдачу сигнала об исключении «недопустимая операция» .

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

Обоснование дизайна IEEE 754 [ править ]

Уильям Кахан . Основной архитектор сопроцессора Intel 80x87 с плавающей запятой и стандарта IEEE 754 с плавающей запятой.

Распространено заблуждение, что обсуждаемые здесь более эзотерические особенности стандарта IEEE 754, такие как расширенные форматы, NaN, бесконечности, субнормальные и т. Д., Представляют интерес только для численных аналитиков или для продвинутых численных приложений; На самом деле верно и обратное: эти функции разработаны для обеспечения надежных и надежных параметров по умолчанию для неискушенных в числовом отношении программистов, в дополнение к поддержке сложных числовых библиотек экспертами. Ключевой разработчик IEEE 754 Уильям Каханотмечает, что неправильно «... [считать] особенности стандарта IEEE 754 для двоичной арифметики с плавающей запятой, которые ... [не] считаются функциями, которые могут использоваться только экспертами по числовым вычислениям. Факты совершенно противоположны. В 1977 году эти функции были встроены в Intel 8087, чтобы обслуживать максимально широкий рынок ... Анализ ошибок показывает нам, как разработать арифметику с плавающей запятой, подобную стандарту IEEE 754, умеренно терпимую к благонамеренному невежеству программистов ". [23]

  • Специальные значения, такие как бесконечность и NaN, гарантируют, что арифметика с плавающей запятой будет алгебраически завершена, так что каждая операция с плавающей запятой дает четко определенный результат и не будет - по умолчанию - вызывать машинное прерывание или ловушку. Более того, выбор специальных значений, возвращаемых в исключительных случаях, был разработан так, чтобы во многих случаях давать правильный ответ, например, непрерывные дроби, такие как R (z): = 7 - 3 / [z - 2 - 1 / (z - 7 + 10 / [z - 2 - 2 / (z - 3)])] даст правильный ответ во всех входных данных в соответствии с арифметикой IEEE 754, поскольку потенциальное деление на ноль, например, R (3) = 4.6, правильно обрабатывается как + бесконечность и поэтому можно смело игнорировать. [24] Как отметил Кахан, необработанная ловушка, следующая за переполнением преобразования с плавающей запятой в 16-битное целое число, которое привело к потере Ariane 5rocket не произошло бы при стандартной политике с плавающей запятой IEEE 754. [23]
  • Субнормальные числа гарантируют, что для конечных чисел с плавающей запятой x и y, x - y = 0 тогда и только тогда, когда x = y, как ожидалось, но чего не было в более ранних представлениях с плавающей запятой. [13]
  • Обоснование разработки 80-битного формата x87 Кахан отмечает: «Этот расширенный формат предназначен для использования с незначительной потерей скорости для всех, кроме простейших арифметических операций с операндами с плавающей запятой и двойными операндами. Например, его следует использовать для временных переменных в циклах, которые реализуют повторения, такие как полиномиальные вычисления, скалярные произведения, частичные и непрерывные дроби. Это часто предотвращает преждевременное переполнение / потеря значимости или серьезную локальную отмену, которая может испортить простые алгоритмы ". [25] Вычисление промежуточных результатов в расширенном формате с высокой точностью и расширенным показателем имеет прецеденты в исторической практике научного расчета , так и в оформлении научных калькуляторов , например , Hewlett-Packard «сФинансовые калькуляторы выполняли арифметические и финансовые функции с точностью до трех знаков после запятой, чем они хранят или отображают. [25] Реализация расширенной точности позволила легко разработать стандартные библиотеки элементарных функций, которые обычно давали результаты с двойной точностью в пределах одной единицы на последнем месте (ULP) на высокой скорости.
  • Правильное округление значений до ближайшего представимого значения позволяет избежать систематических ошибок в расчетах и ​​замедляет рост ошибок. Округление связей до четного устраняет статистическую ошибку, которая может возникнуть при добавлении аналогичных цифр.
  • Направленное округление предназначалось для помощи при проверке границ ошибок, например, в интервальной арифметике. Он также используется при реализации некоторых функций.
  • Математическая основа операций позволяла относительно легко создавать высокоточные многословные арифметические подпрограммы.

Свойство форматов одинарной и двойной точности состоит в том, что их легко сортировать без использования оборудования с плавающей запятой. Их биты, интерпретируемые как целое число с дополнением до двух, уже правильно сортируют положительные, а отрицательные - наоборот. С помощью xor, изменяющего знаковый бит для положительных значений и всех битов для отрицательных значений, все значения становятся сортируемыми как целые числа без знака (с -0 <+0 ). [26] Неясно, предназначено ли это свойство.

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

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

  • Microsoft Binary Format (MBF) была разработана для продуктов Microsoft BASIC языка, в том числе первый в истории продукт компании Microsoft Altair BASIC (1975), TRS-80 LEVEL II , CP / M 's MBASIC , IBM PC 5150 ' сек BASICA , MS- DOS «s GW-BASIC и QuickBASIC до версии 4.00. QuickBASIC версий 4.00 и 4.50 переключился на формат IEEE 754-1985, но может вернуться к формату MBF с помощью параметра команды / MBF. MBF был разработан и создан на моделируемой Intel 8080 на Монте Davidoff , в dormmate от Билла Гейтсавесной 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»), [27] [28] формата MBF с расширенной точностью (40 бит, «9-значный BASIC»), [28] и Формат двойной точности MBF (64 бита); [27] [29] каждый из них представлен 8-битовой экспонентой, за которой следует бит знака, за которым следует мантисса из 23, 31 и 55 битов соответственно.
  • Формат Bfloat16 требует того же объема памяти (16 бит), что и формат IEEE 754 с половинной точностью , но выделяет 8 бит для экспоненты вместо 5, таким образом обеспечивая тот же диапазон, что и для числа с одинарной точностью IEEE 754 . Компромисс заключается в уменьшении точности, поскольку конечное значение поля значения уменьшается с 10 до 7 бит. Этот формат в основном используется при обучении моделей машинного обучения , где диапазон важнее точности. Многие ускорители машинного обучения обеспечивают аппаратную поддержку этого формата.
  • Формат TensorFloat-32 [30] обеспечивает лучшее из форматов Bfloat16 и половинной точности, имея 8 бит экспоненты в первом и 10 бит конечного поля значимости во втором. Этот формат был представлен Nvidia , который обеспечивает его аппаратную поддержку в тензорных ядрах своих графических процессоров, основанных на архитектуре Nvidia Ampere. Недостатком этого формата является его общий размер 19 бит, что не является степенью 2. Однако, согласно Nvidia, этот формат должен использоваться только внутренними аппаратными средствами для ускорения вычислений, в то время как входные и выходные данные должны храниться в 32-битный формат IEEE 754 с одинарной точностью. [30]

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

По своей природе все числа, выраженные в формате с плавающей запятой, являются рациональными числами с завершающим расширением в соответствующем основании (например, завершающим десятичным расширением в базе-10 или завершающим двоичным расширением в базе-2). Иррациональные числа, такие как π или √2, или непрерывные рациональные числа должны быть аппроксимированы. Количество цифр (или битов) точности также ограничивает набор рациональных чисел, которые могут быть представлены точно. Например, десятичное число 123456789 не может быть точно представлено, если доступны только восемь десятичных цифр точности (будет округлено до 123456790 или 123456780, если крайняя правая цифра 0 явно не представлена), то же самое относится к незавершенным цифрам (. 5 округляется до 0,5555555 или 0,5555556).

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

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

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

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

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

е = −4; s = 110011001100110011001101,

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

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

11.0010010000111111011010101000100010000101101000110000100011010011 ...

но это

11.0010010000111111011011

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

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

3.141592 7410125732421875,

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

3,14159265358979323846264338327950 ...

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

Арифметическая разница между двумя последовательными представляемыми числами с плавающей запятой, которые имеют одинаковый показатель степени, называется единицей на последнем месте (ULP). Например, если нет представимого числа, лежащего между представимыми числами 1.45a70c22 шестнадцатеричный и 1.45a70c24 шестнадцатеричный , ULP будет 2 × 16 −8 или 2 −31 . Для чисел с показателем степени 0 по основанию 2, т. Е. Чисел с абсолютным значением выше или равным 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 определяет следующие режимы округления:

  • округлять до ближайшего, где связывает округление до ближайшей четной цифры в требуемой позиции (по умолчанию и, безусловно, наиболее распространенный режим)
  • округление до ближайшего, где связи округляются от нуля (необязательно для двоичных чисел с плавающей запятой и обычно используются в десятичных)
  • округлить в большую сторону (в сторону + ∞; отрицательные результаты, таким образом, округлить в сторону нуля)
  • округлить в меньшую сторону (в сторону −∞; отрицательные результаты, таким образом, округлить от нуля)
  • округление до нуля (усечение; это похоже на обычное поведение преобразований с плавающей запятой в целые числа, которые преобразуют -3,9 в -3 и 3,9 в 3)

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

Преобразование двоичного числа в десятичное [ править ]

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

  • Dtoa.c Дэвида М. Гэя , практическая реализация многих идей в Dragon4 с открытым исходным кодом. Также включает синтаксический анализатор десятичных строк.
  • Grisu3 с 4-кратным ускорением, поскольку он устраняет использование бигнумов . Необходимо использовать с резервным вариантом, так как он не работает примерно в 0,5% случаев. [32]
  • Errol3, всегда успешный алгоритм, похожий на Grisu3, но более медленный. Очевидно, не так хорошо, как преждевременное завершение работы Grisu с запасным вариантом. [33]
  • Ryū, всегда успешный алгоритм, который быстрее и проще, чем Grisu3. [34]

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

Арифметические операции с плавающей запятой [ править ]

Для простоты представления и понимания в примерах будет использоваться десятичная система счисления с точностью до 7 цифр, как и в формате decimal32 IEEE 754 . Основные принципы одинаковы для любой системы счисления или точности, за исключением того, что нормализация не является обязательной (она не влияет на числовое значение результата). Здесь 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; s = 1,234567 (123456,7)+ е = 2; s = 1,017654 (101,7654)
 е = 5; s = 1,234567+ е = 5; s = 0,001017654 (после переключения)-------------------- е = 5; s = 1,235584654 (истинная сумма: 123558,4654)

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

 е = 5; s = 1,235585 (итоговая сумма: 123558,5)

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

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

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


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

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

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

Умножение и деление [ править ]

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

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

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

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

Работа в исключительных случаях [ редактировать ]

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

  • Операция может быть математически неопределенной, например, ∞ / ∞ или деление на ноль .
  • В принципе, операция может быть допустимой, но не поддерживается конкретным форматом, например, вычислением квадратного корня из -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 определяет пять арифметических исключений, которые должны быть записаны во флагах состояния («липкие биты»):

  • неточный , устанавливается, если округленное (и возвращаемое) значение отличается от математически точного результата операции.
  • недополнение , устанавливается, если округленное значение крошечное (как указано в IEEE 754) и неточное (или может быть ограничено, если оно имеет потерю денормализации, в соответствии с версией IEEE 754 1984 г.), возвращая субнормальное значение, включая нули.
  • переполнение , устанавливается, если абсолютное значение округленного значения слишком велико для представления. Возвращается бесконечное или максимальное конечное значение, в зависимости от того, какое округление используется.
  • деление на ноль , устанавливается, если результат бесконечен для заданных конечных операндов, возвращая бесконечность, либо + ∞, либо -∞.
  • недопустимый , устанавливается, если результат с действительным знаком не может быть возвращен, например sqrt (-1) или 0/0, возвращая тихий NaN.
Рис.1: Сопротивления, включенные параллельно, с полным сопротивлением

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

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

Проблемы с точностью [ править ]

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

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

0,100000001490116119384765625 ровно.

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

0,010000000298023226097399174250313080847263336181640625 точно.

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

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 (b + c) ____________ 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, и других незначительных неточностей, могут возникать следующие явления:

  • Отмена : вычитание почти равных операндов может вызвать крайнюю потерю точности. [40] [37] Когда мы вычитаем два почти равных числа, мы устанавливаем самые значащие цифры на ноль, оставляя себе только незначительные и наиболее ошибочные цифры. [4] : 124 Например, при определении производной функции используется следующая формула:
Интуитивно хотелось бы, чтобы h было очень близко к нулю, однако при использовании операций с плавающей запятой наименьшее число не даст наилучшего приближения производной. По мере того, как h становится меньше, разница между f (a + h) и f (a) становится меньше, отбрасывая наиболее значимые и наименее ошибочные цифры и делая наиболее ошибочные цифры более важными. В результате наименьшее возможное число h даст более ошибочное приближение производной, чем несколько большее число. Это, пожалуй, самая частая и серьезная проблема точности.
  • Преобразование в целое число не является интуитивным: преобразование (63,0 / 9,0) в целое число дает 7, но преобразование (0,63 / 0,09) может дать 6. Это связано с тем, что преобразования обычно усекают, а не округляют. Функции пола и потолка могут давать ответы, которые отличаются от интуитивно ожидаемого значения на единицу.
  • Ограниченный диапазон экспоненты: результаты могут быть переполнены, давая бесконечность, или недостаточное количество, давая субнормальное число или ноль. В этих случаях точность будет потеряна.
  • Проверка на безопасное деление проблематична: проверка того, что делитель не равен нулю, не гарантирует, что деление не будет переполнено.
  • Проверка на равенство проблематична. Две математически равные вычислительные последовательности могут давать разные значения с плавающей запятой. [41]

Инциденты [ править ]

  • С 25 февраля 1991 года потеря значимости в MIM-104 Patriot ракетной батарее предотвратить его от перехвата входящего Scud ракеты в Дахране , Саудовская Аравия , способствуя гибели 28 солдат из армии США 14 - квартирмейстер отряда . [42]

Машинная точность и обратный анализ ошибок [ править ]

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

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

при округлении до ближайшего,

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

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

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

и другие

где

где

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

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

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

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

двойной  А ( двойной  Х ){ двойной  Y ,  Z ;  // [1] Y  =  X  -  1,0 ; Z  =  ехр ( Y ); если  ( Z  ! =  1.0 )  Z  =  Y / ( Z  -  1.0 );  // [2] возврат ( Z );}

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

 если  ( Z  ! =  1.0 )  Z  =  log ( Z ) / ( Z  -  1.0 );

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

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

Подробное рассмотрение методов написания высококачественного программного обеспечения с плавающей запятой выходит за рамки данной статьи, и читатель может найти ссылки [45] [49] и другие ссылки в конце этой статьи. Кахан предлагает несколько практических правил, которые могут существенно снизить на порядки [49] риск численных аномалий в дополнение к более тщательному численному анализу или вместо него. К ним относятся: как отмечалось выше, вычисление всех выражений и промежуточных результатов с наивысшей точностью, поддерживаемой аппаратным обеспечением (общее практическое правило - нести вдвое большую точность желаемого результата, т. Е. Вычислять с двойной точностью для окончательного результата с одинарной точностью, или с двойной расширенной или четверной точностью для результатов до двойной точности[24] ); округление входных данных и результатов до точности, требуемой и поддерживаемой входными данными (избыточная точность конечного результата, превышающая требуемую и поддерживаемую входными данными, может вводить в заблуждение, увеличивает стоимость хранения и снижает скорость, а избыточные биты могут влияют на сходимость численных процедур: [50] в частности, первая форма итеративного примера, приведенного ниже, сходится правильно при использовании этого практического правила). Далее следуют краткие описания нескольких дополнительных проблем и методов.

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

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

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

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

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

3253,671+ 3,141276-----------3256,812

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

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

  • Первая форма:
  • вторая форма:
, сходящаяся как

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

i 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 +0,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 знакам точности.

См. Также [ править ]

  • C99 для примеров кода, демонстрирующих доступ и использование функций IEEE 754.
  • Вычислимое число
  • Сопроцессор
  • Десятичное число с плавающей точкой
  • Двойная точность
  • Экспериментальная математика - использует высокоточные вычисления с плавающей запятой.
  • Арифметика с фиксированной точкой
  • Устранение ошибок с плавающей запятой
  • ФЛОПЫ
  • Точные таблицы Гала
  • Библиотека GNU Multi-Precision
  • Половинная точность
  • IEEE 754 - Стандарт двоичной арифметики с плавающей запятой
  • Архитектура IBM с плавающей запятой
  • Алгоритм суммирования Кахана
  • Двоичный формат Microsoft (MBF)
  • Minifloat
  • Q (числовой формат) для постоянного разрешения
  • Четверная точность
  • Значащие цифры
  • Одинарная точность
  • 0,999 ... - каждый ненулевой завершающий десятичный разделитель имеет два равных представления

Заметки [ править ]

  1. ^ Мантисса числа с плавающей точкой также называется мантиссой некоторых авторы-не следует путать с мантиссой в виде логарифмов . Некоторые также используют несколько расплывчатые термины, такие как коэффициент или аргумент . Использование термина « фракция » некоторыми авторами также может ввести в заблуждение. Термин характеристика (используемый, например, CDC ) неоднозначен, так как исторически он также использовался для определения некоторой формы экспоненты чисел с плавающей запятой.
  2. ^ Показатель числа с плавающей точкой иногда также называют шкалой . Термин характеристика (для смещенной экспоненты , смещения экспоненты или избыточного n-представления ) неоднозначен, так как исторически он также использовался для определения значимости чисел с плавающей запятой.
  3. ^ Шестнадцатеричная (base-16) арифметика с плавающей запятой используется в IBM System 360 (1964) и 370 (1970), а также в различных новых машинах IBM, в компьютерах Manchester MU5 (1972) и HEP (1982). Он также используется в 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). Он также используется в цифровых полевых системах DFS IV и V с высоким разрешением.
  6. ^ Арифметика с плавающей запятой Base-256 используется вкомпьютере Rice Institute R1 (с 1958 г.).
  7. ^ Арифметика с плавающей запятой Base-65536 используется в компьютере MANIAC II (1956).
  8. ^ Компьютерное оборудование не обязательно вычисляет точное значение; он просто должен выдать эквивалентный округленный результат, как если бы он вычислил бесконечно точный результат.
  9. ^ Чрезвычайная сложность современных алгоритмов деления однажды привела к известной ошибке. Ранняя версиячипа Intel Pentium поставлялась с инструкцией деления, которая в редких случаях давала несколько неверные результаты. Многие компьютеры были отправлены до того, как была обнаружена ошибка. Пока не были заменены неисправные компьютеры, были разработаны исправленные версии компиляторов, которые позволили избежать сбоев. См. Ошибку Pentium FDIV .
  10. ^ Но попытка вычисления cos (π) дает в точности −1. Поскольку производная близка к нулю около π, влияние неточности в аргументе намного меньше, чем расстояние между числами с плавающей запятой вокруг -1, и округленный результат является точным.
  11. ^ Уильям Кахан отмечает: «За исключением чрезвычайно редких ситуаций, сверхточная арифметика обычно снижает риски, связанные с округлением, с гораздо меньшими затратами, чем цена компетентного аналитика ошибок».
  12. ^ Разложение в ряд Тейлора этой функции показываетчто она хорошо кондиционером около 1: А (х) = 1 - (х-1) / 2 + (х-1) ^ 2/12 - (х-1) ^ 4 / 720 + (x − 1) ^ 6/30240 - (x − 1) ^ 8/1209600 + ... для | x − 1 | <π.
  13. ^ Если long double - это четверная точность IEEE, то полная двойная точность сохраняется; если long double - это двойная расширенная точность IEEE, то сохраняется дополнительная, но не полная точность.
  14. ^ Эквивалентность двух форм может быть проверена алгебраически, отметивчто знаменатель дроби во второй форме является конъюгат в числителе первого. Умножая верхнюю и нижнюю часть первого выражения на это сопряжение, получаем второе выражение.

Ссылки [ править ]

  1. ^ В. Смит, Стивен (1997). «Глава 28, Фиксированная или Плавающая точка» . Руководство для ученых и инженеров по цифровой обработке сигналов . Калифорнийский технический паб. п. 514. ISBN 978-0-9660176-3-2. Проверено 31 декабря 2012 .
  2. ^ a b Zehendner, Эберхард (лето 2008 г.). "Rechnerarithmetik: Fest- und Gleitkommasysteme" (PDF) (сценарий лекции) (на немецком языке). Фридрих-Шиллер-Университет Йены . п. 2. Архивировано (PDF) из оригинала на 2018-08-07 . Проверено 7 августа 2018 . [1] (NB. В этой ссылке неверно указано основание с плавающей запятой MANIAC II как 256, тогда как на самом деле это 65536.)
  3. ^ а б в г Биби, Нельсон Х.Ф. (22.08.2017). «Глава H. Исторические архитектуры с плавающей запятой». Справочник по математическим вычислениям функций - Программирование с использованием переносимой программной библиотеки MathCW (1-е изд.). Солт-Лейк-Сити, Юта, США: Springer International Publishing AG . п. 948. DOI : 10.1007 / 978-3-319-64110-2 . ISBN 978-3-319-64109-6. LCCN  2017947446 . S2CID  30244721 .
  4. ^ a b c d e Мюллер, Жан-Мишель; Брисебар, Николас; де Динешен, Флоран; Жаннерод, Клод-Пьер; Лефевр, Винсент; Мелькионд, Гийом; Revol, Натали; Stehlé, Damien; Торрес, Серж (2010). Справочник по арифметике с плавающей точкой (1-е изд.). Birkhäuser . DOI : 10.1007 / 978-0-8176-4705-6 . ISBN 978-0-8176-4704-9. LCCN  2009939668 .
  5. ^ Савард, Джон JG (2018) [2007], «Десятичный стандарт с плавающей запятой» , quadibloc , заархивировано из оригинала 03.07.2018 , получено 16.07.2018
  6. ^ Паркинсон, Роджер (2000-12-07). «Глава 2 - Цифровые системы обследования места с высоким разрешением - Глава 2.1 - Системы цифровой полевой регистрации» . Обследования сайтов с высоким разрешением (1-е изд.). CRC Press . п. 24. ISBN 978-0-20318604-6. Проверено 18 августа 2019 . […] Такие системы, как [Digital Field System] DFS IV и DFS V, были четвертичными системами с плавающей запятой и использовали шаг усиления 12 дБ. […] (256 страниц)
  7. ^ Лазарус, Роджер Б. (1957-01-30) [1956-10-01]. "МАНИАК II" (PDF) . Лос-Аламос, Нью-Мексико, США: Лос-Аламосская научная лаборатория Калифорнийского университета. п. 14. LA-2083. Архивировано (PDF) из оригинала на 2018-08-07 . Проверено 7 августа 2018 . […] Плавучая база Маньяка, которая равна 2 16 = 65 536. […] Большая база Maniac позволяет значительно увеличить скорость арифметики с плавающей запятой. Хотя такая большая база подразумевает возможность наличия до 15 ведущих нулей, большой размер слова в 48 битов гарантирует адекватную значимость. […]
  8. ^ Рэнделл, Брайан (1982). «От аналитической машины к электронно-цифровому компьютеру: вклад Ладгейта, Торреса и Буша». IEEE Annals of the History of Computing . 4 (4): 327–341. DOI : 10,1109 / mahc.1982.10042 . S2CID 1737953 . 
  9. Рохас, Рауль (1997). «Наследие Конрада Цузе: Архитектура Z1 и Z3» (PDF) . IEEE Annals of the History of Computing . 19 (2): 5–15. DOI : 10.1109 / 85.586067 .
  10. ^ Rojas, Рауль (2014-06-07). «Z1: Архитектура и алгоритмы первого компьютера Конрада Цузе». arXiv : 1406.1886 [ cs.AR ].
  11. ^ a b Кахан, Уильям Мортон (1997-07-15). «Пагубное влияние компьютерных языков и тестов на прикладную математику, физику и химию. Лекция Джона фон Неймана» (PDF) . п. 3.
  12. ^ Рэнделл, Брайан , изд. (1982) [1973]. Истоки цифровых компьютеров: избранные статьи (3-е изд.). Берлин; Нью-Йорк: Springer-Verlag . п. 244. ISBN 978-3-540-11319-5.
  13. ^ a b Северанс, Чарльз (1998-02-20). «Интервью со Стариком Плавающей Точки» .
  14. ^ ISO / IEC 9899: 1999 - Языки программирования - C . Iso.org. §F.2, примечание 307. «Расширенный» - это дважды расширенный формат данных МЭК 60559. Расширенный относится как к обычным 80-битным, так и к четырехкратным 128-битным форматам IEC 60559.
  15. ^ Использование GNU Compiler Collection, параметры i386 и x86-64. Архивировано 16 января 2015 г. на Wayback Machine .
  16. ^ "длинный двойной (только для GCC) и __float128" . StackOverflow .
  17. ^ «Стандарт вызова процедур для 64-битной архитектуры ARM (AArch64)» (PDF) . 2013-05-22 . Проверено 22 сентября 2019 .
  18. ^ "Справочник по компилятору ARM Compiler toolchain, версия 5.03" (PDF) . 2013. Раздел 6.3 Основные типы данных . Проверено 8 ноября 2019 .
  19. ^ Кахан, Уильям Мортон (2004-11-20). «О стоимости вычислений с плавающей запятой без сверхточной арифметики» (PDF) . Проверено 19 февраля 2012 .
  20. ^ "openEXR" . openEXR . Проверено 25 апреля 2012 .
  21. ^ "Анализ IEEE-754" .
  22. ^ a b c d Голдберг, Дэвид (март 1991 г.). «Что должен знать каждый компьютерный ученый об арифметике с плавающей точкой» (PDF) . ACM Computing Surveys . 23 (1): 5–48. DOI : 10.1145 / 103162.103163 . S2CID 222008826 . Проверено 20 января 2016 .  ( [2] , [3] , [4] )
  23. ^ a b c Кахан, Уильям Мортон ; Дарси, Джозеф (2001) [1998-03-01]. «Как плавающая точка в Java причиняет вред всем и везде» (PDF) . Проверено 5 сентября 2003 .
  24. ^ a b Кахан, Уильям Мортон (1981-02-12). «Зачем нам нужен стандарт арифметики с плавающей запятой?» (PDF) . п. 26.
  25. ^ a b Кахан, Уильям Мортон (1996-06-11). «Пагубное влияние компьютерных тестов на прикладную математику, физику и химию» (PDF) .
  26. ^ Херф, Майкл (декабрь 2001). "хитрости счисления" . стереопсис: графика .
  27. ^ a b Сотрудники Borland (1998-07-02) [1994-03-10]. «Преобразование между форматами Microsoft Binary и IEEE» . База данных технической информации (TI1431C.txt). Embarcadero USA / Inprise (первоначально: Borland ). ID 1400. Архивировано 20 февраля 2019 года . Проверено 30 мая 2016 . […] _Fmsbintoieee (float * src4, float * dest4) […] Двоичный формат MS […] порядок байтов => m3 | м2 | m1 | экспонента […] 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 Binary Format […] порядок байтов => m7 | m6 | m5 | m4 | м3 | м2 | m1 | экспонента […] m1 - старший значащий байт => smmm | mmmm […] m7 - младший значащий байт […] MBF - смещение 128, а IEEE - смещение 1023. […] MBF помещает десятичную точку перед предполагаемым битом, а IEEE помещает десятичную точку после предполагаемого бита. […] Ieee_exp = msbin [7] - 128 - 1 + 1023; […]
  28. ^ a b Steil, Майкл (2008-10-20). «Создайте свою собственную версию Microsoft BASIC для 6502» . pagetable.com. Архивировано 30 мая 2016 года . Проверено 30 мая 2016 .
  29. ^ «IEEE против двоичного формата Microsoft; проблемы с округлением (полностью)» . Служба поддержки Microsoft . Microsoft . 21 ноября 2006 г. Идентификатор статьи KB35826, Q35826. Архивировано 28 августа 2020 года . Проверено 24 февраля 2010 .
  30. ^ a b Харья, Пареш (14 мая 2020 г.). «TensorFloat-32 в графическом процессоре A100 ускоряет обучение ИИ, высокопроизводительные вычисления до 20 раз» . Проверено 16 мая 2020 .
  31. ^ Кахан, Уильям Мортон (2006-01-11). «Насколько бесполезны бездумные оценки округления в вычислениях с плавающей запятой?» (PDF) .
  32. ^ Loitsch, Флориан (2010). «Быстрая и точная печать чисел с плавающей запятой с целыми числами» (PDF) . Материалы конференции ACM SIGPLAN 2010 года по проектированию и реализации языков программирования - PLDI '10 : 233. doi : 10.1145 / 1806596.1806623 . ISBN  9781450300193. S2CID  910409 .
  33. ^ "Добавлена ​​поддержка алгоритма Grisu3 для double.ToString (). By mazong1123 · Pull Request # 14646 · dotnet / coreclr" . GitHub .
  34. ^ Адамс, Ульф (2018-12-02). «Рю: быстрое преобразование числа с плавающей точкой в ​​строку» . Уведомления ACM SIGPLAN . 53 (4): 270–282. DOI : 10.1145 / 3296979.3192369 . S2CID 218472153 . 
  35. ^ "Google / двойное преобразование" . 2020-09-21.
  36. ^ Паттерсон, Дэвид А .; Хеннесси, Джон Л. (2014). Компьютерная организация и дизайн, аппаратно-программный интерфейс . Серия Морган Кауфманн по компьютерной архитектуре и дизайну (5-е изд.). Уолтем, Массачусетс: Elsevier. п. 793. ISBN. 9789866052675.
  37. ^ a b Патент США 3037701A , Huberto M Sierra, "Средство управления арифметикой с плавающей десятичной запятой для калькулятора", выдан 5 июня 1962 г. 
  38. ^ a b Кахан, Уильям Мортон (1997-10-01). «Лекционные заметки о статусе стандарта IEEE 754 для двоичной арифметики с плавающей запятой» (PDF) . п. 9.
  39. ^ "D.3.2.1" . Руководства разработчиков программного обеспечения для архитектур Intel 64 и IA-32 . 1 .
  40. ^ Харрис, Ричард (октябрь 2010 г.). "Вам придется подумать!" . Перегрузка (99): 5–10. ISSN 1354-3172 . Проверено 24 сентября 2011 . Гораздо большее беспокойство вызывает ошибка отмены, которая может привести к катастрофической потере точности.  [5]
  41. ^ Кристофер Баркер: PEP 485 - Функция для проверки примерного равенства
  42. ^ «Патриот ПРО, проблема программного обеспечения привела к отказу системы в Dharhan, Саудовская Аравия» . Счетная палата правительства США . Отчет GAO IMTEC 92-26.
  43. ^ Уилкинсон, Джеймс Харди (2008-09-08). Ральстон, Энтони; Рейли, Эдвин Д .; Hemmendinger, Дэвид (ред.). Анализ ошибок . Энциклопедия компьютерных наук . Вайли . С. 669–674. ISBN 978-0-470-86412-8. Проверено 14 мая 2013 .
  44. ^ Einarsson, Бо (2005). Точность и надежность в научных вычислениях . Общество промышленной и прикладной математики (SIAM). С. 50–. ISBN 978-0-89871-815-7. Проверено 14 мая 2013 .
  45. ^ a b c d Хайэм, Николас Джон (2002). Точность и устойчивость численных алгоритмов (2-е изд.). Общество промышленной и прикладной математики (SIAM). С. 27–28, 110–123, 493. ISBN 978-0-89871-521-7. 0-89871-355-2.
  46. ^ Оливейра, Суэли; Стюарт, Дэвид Э. (07.09.2006). Написание научного программного обеспечения: руководство по хорошему стилю . Издательство Кембриджского университета . С. 10–. ISBN 978-1-139-45862-7.
  47. ^ a b Кахан, Уильям Мортон (2005-07-15). «Арифметика с плавающей запятой осаждена« бизнес-решениями » » (PDF) (основной доклад). Симпозиум по компьютерной арифметике ARITH 17 , спонсируемый IEEE . С. 6, 18 . Проверено 23 мая 2013 . CS1 maint: location (link)(NB. Кахан оценивает, что вероятность получения чрезмерно неточных результатов вблизи сингулярностей уменьшается примерно в 1/2000 раз при использовании 11 дополнительных бит точности двойного расширения .)
  48. ^ Кахан, Уильям Мортон (2011-08-03). «Отчаянно необходимые средства устранения неисправности больших вычислений с плавающей запятой в науке и технике» (PDF) . Рабочая конференция IFIP / SIAM / NIST по количественной оценке неопределенности в научных вычислениях, г. Боулдер, CO. Стр. 33.
  49. ^ a b c d Кахан, Уильям Мортон (27 августа 2000 г.). «Маркетинг против математики» (PDF) . С. 15, 35, 47.
  50. ^ Кахан, Уильям Мортон (2001-06-04). Биндель, Дэвид (ред.). «Конспект лекций по системной поддержке научных вычислений» (PDF) .
  51. ^ "Общая десятичная арифметика" . Speleotrove.com . Проверено 25 апреля 2012 .
  52. ^ Кристиансен, Том; Торкингтон, Натан; и другие. (2006). "perlfaq4 / Почему int () не работает?" . perldoc.perl.org . Проверено 11 января 2011 .
  53. ^ Шевчук, Джонатан Ричард (1997). «Адаптивная точная арифметика с плавающей запятой и быстрые надежные геометрические предикаты, дискретная и вычислительная геометрия 18» : 305–363. Cite journal requires |journal= (help)
  54. ^ Кахан, Уильям Мортон ; Слоновая кость, Мелоди Ю. (1997-07-03). «Округление ухудшает идеализированный консоль» (PDF) .

Дальнейшее чтение [ править ]

  • Уилкинсон, Джеймс Харди (1963). Ошибки округления в алгебраических процессах (1-е изд.). Энглвуд Клиффс, Нью-Джерси, США: ISBN Prentice-Hall, Inc.  9780486679990. Руководство по ремонту  0161456 . (NB. Классические влиятельные трактаты по арифметике с плавающей запятой.)
  • Уилкинсон, Джеймс Харди (1965). Алгебраическая проблема собственных значений . Монографии по численному анализу (1-е изд.). Oxford University Press / Clarendon Press . ISBN 9780198534037. Проверено 11 февраля 2016 .
  • Стербенз, Пэт Х. (1974-05-01). Вычисление с плавающей точкой . Серия Прентис-Холла в автоматических вычислениях (1-е изд.). Энглвуд Клиффс, Нью-Джерси, США: Прентис Холл . ISBN 0-13-322495-3.
  • Голуб, Джин Ф .; ван Лоан, Чарльз Ф. (1986). Матричные вычисления (3-е изд.). Издательство Университета Джона Хопкинса . ISBN 978-0-8018-5413-2.
  • Press, Уильям Генри ; Теукольский, Саул А .; Веттерлинг, Уильям Т .; Фланнери, Брайан П. (2007) [1986]. Числовые рецепты - Искусство научных вычислений (3-е изд.). Издательство Кембриджского университета . ISBN 978-0-521-88407-5. (NB. Версия с исходным кодом CD-ROM.)
  • Кнут, Дональд Эрвин (1997). «Раздел 4.2: Арифметика с плавающей точкой». Искусство программирования . 2: получисловые алгоритмы (3-е изд.). Эддисон-Уэсли . С. 214–264. ISBN 978-0-201-89684-8.
  • Блаау, Геррит Энн ; Брукс-младший, Фредерик Филлипс (1997). Компьютерная архитектура: концепции и эволюция (1-е изд.). Эддисон-Уэсли . ISBN 0-201-10557-8. (1213 страниц) (NB. Это однотомное издание. Этот труд был также доступен в двухтомном варианте.)
  • Savard, John JG (2018) [2005], «Форматы с плавающей запятой» , quadibloc , заархивировано из оригинала 16 июля 2018 г. , получено 16 июля 2018 г.
  • Мюллер, Жан-Мишель; Бруни, Николас; де Динешен, Флоран; Жаннерод, Клод-Пьер; Джолдес, Миоара; Лефевр, Винсент; Мелькионд, Гийом; Revol, Натали; Торрес, Серж (2018) [2010]. Справочник по арифметике с плавающей точкой (2-е изд.). Birkhäuser . DOI : 10.1007 / 978-3-319-76526-6 . ISBN 978-3-319-76525-9. LCCN  2018935254 .

Внешние ссылки [ править ]

  • «Обзор форматов с плавающей запятой» . (NB. Эта страница дает очень краткий обзор форматов с плавающей запятой, которые использовались на протяжении многих лет.)
  • Моннио, Дэвид (май 2008 г.). «Подводные камни проверки вычислений с плавающей запятой» . Ассоциация вычислительной техники (ACM). Транзакции по языкам и системам программирования (TOPLAS). (NB. Сборник неинтуитивных поведений с плавающей запятой на популярных архитектурах, с последствиями для проверки и тестирования программ.)
  • OpenCores . (Примечание. Этот сайт содержит IP - ядро с плавающей точкой с открытым исходным кодом для реализации с плавающей точкой операторов в FPGA или ASIC устройств. Проект double_fpu содержит Verilog исходного кода с плавающей точкой единичной двойной точности. Проект fpuvhdl содержит источник VHDL код единицы с плавающей запятой одинарной точности.)
  • Флигал, Эрик (2004). «Оптимизация с плавающей точкой Microsoft Visual C ++» . MSDN .