Особенности арифметики с плавающей запятой в современных компьютерах
Представлен краткий обзор чисел с плавающей запятой и соответствующей арифметики. Подчеркнуты особенности, которые отличают ее от арифметики действительных чисел и часто являются причиной существенных проблем при численном решении задач на компьютере. Эти проблемы усиливаются на больших объемах данн...
Saved in:
| Published in: | Компьютерная математика |
|---|---|
| Date: | 2016 |
| Main Authors: | , |
| Format: | Article |
| Language: | Russian |
| Published: |
Інститут кібернетики ім. В.М. Глушкова НАН України
2016
|
| Subjects: | |
| Online Access: | https://nasplib.isofts.kiev.ua/handle/123456789/168401 |
| Tags: |
Add Tag
No Tags, Be the first to tag this record!
|
| Journal Title: | Digital Library of Periodicals of National Academy of Sciences of Ukraine |
| Cite this: | Особенности арифметики с плавающей запятой в современных компьютерах / Р.А. Ющенко, А.К. Ющенко // Компьютерная математика. — 2016. — № 1. — С. 80-92. — Бібліогр.: 13 назв. — рос. |
Institution
Digital Library of Periodicals of National Academy of Sciences of Ukraine| _version_ | 1859851817175744512 |
|---|---|
| author | Ющенко, Р.А. Ющенко, А.К. |
| author_facet | Ющенко, Р.А. Ющенко, А.К. |
| citation_txt | Особенности арифметики с плавающей запятой в современных компьютерах / Р.А. Ющенко, А.К. Ющенко // Компьютерная математика. — 2016. — № 1. — С. 80-92. — Бібліогр.: 13 назв. — рос. |
| collection | DSpace DC |
| container_title | Компьютерная математика |
| description | Представлен краткий обзор чисел с плавающей запятой и соответствующей арифметики. Подчеркнуты особенности, которые отличают ее от арифметики действительных чисел и часто являются причиной существенных проблем при численном решении задач на компьютере. Эти проблемы усиливаются на больших объемах данных и параллельных вычислениях. Несмотря на все это, минимизировать и даже гарантировать точность решений возможно даже без существенных потерь в производительности.
Представлено короткий огляд чисел із плаваючою комою і відповідної арифметики. Підкреслено особливості, які відрізняють її від арифметики дійсних чисел і часто є причиною істотних проблем під час числового розв’язання задач на комп’ютері. Ці проблеми підсилюються на даних великого обсягу і в паралельних обчисленнях. Незважаючи на все це, мінімізувати й навіть гарантувати точність ровз’язку можливо навіть без суттєвих втрат обчислювальної продуктивності.
An overview of modern floating point arithmetic is presented. The aspects, which are different from real numbers arithmetic, and, thus, cause a lot of numeric problems are outlined. These problems become substantial on large amounts of data and in parallel computations. Nevertheless, it is possible to guarantee the required accuracy of the results without considerable loss of performance.
|
| first_indexed | 2025-12-07T15:41:21Z |
| format | Article |
| fulltext |
80 Компьютерная математика. 2016, № 1
Представлен краткий обзор чисел
с плавающей запятой и соответ-
ствующей арифметики. Подчерк-
нуты особенности, которые от-
личают ее от арифметики дей-
ствительных чисел и часто явля-
ются причиной существенных
проблем при численном решении
задач на компьютере. Эти про-
блемы усиливаются на больших
объемах данных и параллельных
вычислениях. Несмотря на все
это, минимизировать и даже
гарантировать точность реше-
ний возможно даже без сущест-
венных потерь в производитель-
ности.
© Р.А. Ющенко, А.К. Ющенко,
2016
УДК 004
Р.А. ЮЩЕНКО, А.К. ЮЩЕНКО
ОСОБЕННОСТИ АРИФМЕТИКИ
С ПЛАВАЮЩЕЙ ЗАПЯТОЙ
В СОВРЕМЕННЫХ КОМПЬЮТЕРАХ
Введение. В 60-е и 70-е годы прошлого века
компьютеры в основном использовались для
решения сложных вычислительных задач
моделирования. В таких расчетах использу-
ются действительные числа и соответствую-
щая арифметика. Но представление любого
действительного числа в общем случае тре-
бует неограниченной памяти, что на компь-
ютерах недостижимо. Это стимулировало
исследования методов представлений дейст-
вительных чисел, используя конечное число
двоичных разрядов. Наиболее распростра-
ненным для вычислительных задач и по се-
годняшний день является представление с
плавающей запятой, в котором обеспечива-
ется компромисс диапазона и точности. От
способа представления числа зависят и свой-
ства арифметики, поэтому разнообразие раз-
личных представлений в эти годы создало
проблемы совместимости программ и аппа-
ратуры. Одни и те же программы на компью-
терах разных производителей возвращали
разный результат, иногда между решениями
не было ничего общего, иногда ни одно из
них вообще не имело физического смысла.
Поэтому в 70-е и 80-е годы была проведена
огромная работа по стандартизации чисел с
плавающей запятой, в результате которой
разработан и до сих пор существует практиче-
ски без изменений стандарт IEEE 754. В ре-
зультате, с середины 80-х годов работа с чис-
лами с плавающей запятой существенно уп-
ростилась, но для гарантии точности или даже
осмысленности решений, по-прежнему необ-
ходимо проводить специальные исследования
в аксиоматике машинной арифметики [1].
ОСОБЕННОСТИ АРИФМЕТИКИ С ПЛАВАЮЩЕЙ ЗАПЯТОЙ В СОВРЕМЕННЫХ КОМПЬЮТЕРАХ
Компьютерная математика. 2016, № 1 81
Свойства компьютерной арифметики особенно ярко стали проявляться в по-
следние годы. Это происходит по нескольким причинам. Во-первых, экспонен-
циальный рост производительности и объемов памяти компьютеров (закон Му-
ра) привел к тому, что масштабы обрабатываемых данных возросли на несколь-
ко порядков. В результате, погрешность округления, не существенная для ма-
леньких задач, снова стала значительной при обработке больших объемов дан-
ных [2]. Во-вторых, производители высокопроизводительной техники и компи-
ляторов часто отступают от стандартов для обеспечения скорости. Это харак-
терно для режимов «быстрой математики» компиляторов и для графических
ускорителей [3]. В-третьих, и здесь мы имеем дело с фундаментальной пробле-
мой, арифметика с плавающей запятой отличается от арифметики действитель-
ных чисел: действительные числа формируют закрытое множество, числа с пла-
вающей запятой – нет, свойства ассоциативности и дистрибутивности в арифме-
тике с плавающей запятой не выполняются и т. д. [4]. Следствия таких побоч-
ных эффектов многократно усиливаются в параллельных вычислениях, посколь-
ку параллелизм как таковой подразумевает реорганизацию вычислений за счет
применения эквивалентных преобразований к алгоритмам. Эквивалентные пре-
образования в обычной арифметике далеко не всегда являются эквивалентными
в компьютерной арифметике.
Основные понятия. Множество целых чисел бесконечно, но всегда можно
подобрать такое число разрядов (бит), чтобы представить любое целое число,
возникающее при решении конкретной задачи. Множество действительных чи-
сел не только бесконечно, но еще и непрерывно, поэтому, независимо от числа
разрядов, неизбежно возникнут числа, которые не имеют точного представле-
ния. Числа с плавающей запятой – один из возможных способов представления
действительных чисел и состоит из набора отдельных разрядов, условно разде-
ленных на знак, порядок и мантиссу. Порядок и мантисса – целые числа, кото-
рые вместе со знаком дают представление числа с плавающей запятой, как пока-
зано на рис. 1.
РИС. 1. Представление числа с плавающей запятой
Математически это записывается так: (–1)s × M × BE, где s – знак, B – осно-
вание, E – порядок, а M – мантисса.
Основание определяет систему счисления разрядов. Математически доказа-
но [5], что числа с плавающей запятой с базой B = 2 (двоичное представление)
наиболее устойчивы к ошибкам округления, поэтому на практике встречаются
только базы 2 и, реже, 10. Для простоты, не теряя общности, для всех примеров
будем полагать B = 2. Таким образом, формула числа с плавающей запятой
будет иметь вид:
(–1)s × M × 2E.
Р.А. ЮЩЕНКО, А.К. ЮЩЕНКО
82 Компьютерная математика. 2016, № 1
Мантисса – это целое число фиксированной длины, представляющее стар-
шие разряды действительного числа. Допустим, мантисса состоит из трех бит
(|M| = 3). Возьмем, например, число «5», которое в двоичной системе будет рав-
но 1012. Старший бит соответствует 22 = 4, средний (который в нашем примере
равен нулю) 21 = 2, а младший 20 = 1. Порядок – это степень базы (двойки) стар-
шего разряда. В нашем случае E = 2. Такие числа удобно записывать в так назы-
ваемой стандартной форме, например, «1.01e + 2». Из такой записи видно, что
мантисса состоит из трех знаков, а порядок равен двум.
Допустим необходимо получить дробное число, используя те же 3 бита ман-
тиссы. Это можно сделать, например, для E = 1. Тогда искомое число будет равно
1.01e + 1 = 1 × 21 + 0 × 20 + 1 × 2–1 = 2 + 0,5 = 2,5.
Очевидно, что таким образом одно и то же число можно представить по-
разному. Рассмотрим пример с длиной мантиссы |M| = 4. Число «2» можно пред-
ставить в следующем виде:
2 = 10 (в двоичной системе) = 1.000e + 1 = 0.100e + 2 = 0.010e + 3.
Существование нескольких представлений одного и того же числа сущест-
венно усложняют сравнение этих чисел в процессоре. Поэтому современные
числа представлены в так называемом нормализованном виде (рис. 2), когда
первый бит мантиссы всегда подразумевался равным единице, экономя один
разряд. Эти и другие идеи воплотились в стандарт IEEE 754, последняя редакция
которого – IEEE 754-2008 [6].
РИС. 2. Нормализованное представление числа с плавающей запятой
Числа с плавающей запятой согласно IEEE-754 представлены в виде знака
(s), мантиссы (M) и порядка (E) следующим образом:
(–1)s × 1.M × 2E.
Чтобы не загромождать читателя чрезмерной информацией, рассмотрим
только один тип данных, с одинарной точностью (single). Числа с половинной
(half), двойной (double) и расширенной (extended) точностью обладают теми же
особенностями, но отличаются числом разрядов порядка и мантиссы. В числах
одинарной точности (float/single) порядок состоит из 8 бит, а мантисса – из 23.
Эффективный порядок определяется как E-127.
Специальные числа. В IEEE 754 число «0» представляется значением с по-
рядком, равным E = Emin –1 (для single это – 127) и нулевой мантиссой. Введение
нуля как самостоятельного числа (так как в нормализованном представлении
нельзя представить ноль) позволило избежать многих странностей в арифмети-
ке. И хоть операции с нулем нужно обрабатывать отдельно, обычно они выпол-
няются быстрее, чем с обычными числами.
ОСОБЕННОСТИ АРИФМЕТИКИ С ПЛАВАЮЩЕЙ ЗАПЯТОЙ В СОВРЕМЕННЫХ КОМПЬЮТЕРАХ
Компьютерная математика. 2016, № 1 83
Также в IEEE 754 предусмотрено представление для специальных чисел, ра-
бота с которыми вызывает исключение. К таким числам относится бесконеч-
ность (± ∞) и неопределенность (NaN). Бесконечности представлены как числа с
порядком E = Emax + 1 и нулевой мантиссой. Получить бесконечность можно при
переполнении и при делении ненулевого числа на ноль. Бесконечность при де-
лении разработчики определили, исходя из существования пределов, когда де-
лимое и делитель стремиться к какому-то числу. Соответственно, c/0 = ± ∞
(например, 3/0 = + ∞, а – 3/0 = – ∞), так как если делимое стремиться к констан-
те, а делитель к нулю, предел равен бесконечности. При 0/0 предел не существу-
ет, поэтому результатом будет неопределенность.
Неопределенность или NaN (от «not a number») – это представление, вве-
денное для того, чтобы арифметическая операция могла всегда вернуть какое-то
не бессмысленное значение. В IEEE 754 NaN представлен как число, в котором
E = Emax + 1, а мантисса не нулевая. Любая операция с NaN возвращает NaN. При
желании в мантиссу можно записывать информацию, которую программа смо-
жет интерпретировать. Стандартом это не оговорено, и мантисса чаще всего
игнорируется. По определению NaN ≠ NaN, поэтому, для проверки значения
переменной нужно просто сравнить его с самим собой.
Значение NaN возникает при выполнении любой из следующих операций:
“∞ + (– ∞)”, “0 × ∞”, “0/0, ∞/∞”, “ x ” (где x < 0).
Число «0». Поскольку в IEEE754 число «0» представлено фиксированным
значением порядка и мантиссы, знак может быть произвольным. В результате,
число «0» имеет два представления, отличающиеся знаком. Так, 3•(+ 0) = + 0,
а 3•(– 0)= – 0. В стандарте знак сохранили умышленно, чтобы выражения, кото-
рые в результате переполнения или потери значимости превращаются в беско-
нечность или в ноль, при умножении и делении все же могли представить наи-
более приближенный к корректному результат. Например, если бы у нуля не
было знака, выражение 1/(1/x) = x не выполнялось бы верно при x = ± ∞, так как
1/∞ и 1/ – ∞ равны 0. Однако по определению принято, что « + 0 = – 0». Это
позволяет избежать дополнительных затруднений и странностей.
Еще один пример: «(+ ∞/0) + ∞ = + ∞», тогда как «(+ ∞/ – 0) + ∞ = NaN».
Бесконечность в данном случае лучше, чем NaN, поскольку если в арифметиче-
ском выражении появился NaN, результатом всего выражения всегда будет NaN.
Если же в выражении встретилась бесконечность, то результатом может быть
ноль, бесконечность или обычное число с плавающей запятой. Например,
«1/∞ = 0». Это позволяет вычислить следующую дробь для x = 1, 2, 3, 4:
3( ) 7 12 .107 22
3
F x
x
x
x
x
Р.А. ЮЩЕНКО, А.К. ЮЩЕНКО
84 Компьютерная математика. 2016, № 1
Денормализованные числа. Пусть имеем нормализованное представление
с длиной мантиссы |M| = 2 бита плюс один бит нормализации (рис. 3) и диапазо-
ном значений порядка – 1 ≤ E ≤ 2. В этом случае получим 16 чисел.
РИС. 3. Нормализованное представление числа с плавающей запятой
Крупными штрихами показаны числа с мантиссой, равной 1,00. Видно, что
расстояние от нуля до ближайшего числа (0 – 0,5) больше, чем от этого числа к
следующему (0,5 – 0,625). Это значит, что разница двух любых чисел от 0,5 до 1
даст 0, даже если эти числа не равны. Что еще хуже, в пропасть между 0,5 и 0
попадает разница чисел, больших 1. Например, «1,5 – 1,25 = 0» (см. рис. 3).
Для решения этой проблемы разработчиками стандарта IEEE 754 сделано
следующее. Мы знаем, что при E = Emin – 1 (для float это «– 127») и нулевой ман-
тиссе число считается равным нулю. Если же мантисса не нулевая, то число счи-
тается не нулевым, его порядок полагается E = Emin, причем неявный старший
бит мантиссы полагается равным нулю. Такие числа называются денормализо-
ванными.
Строго говоря, числа с плавающей запятой теперь имеют вид:
(– 1)s × 1.M × 2E, если Emin ≤ E ≤ Emax (нормализованные числа);
(– 1)s × 0.M × 2Emin, если E = Emin– 1 (денормализованные числа).
Вернемся к примеру. Наш Emin = –1. Введем новое значение порядка, E = – 2,
при котором числа являются денормализованными. В результате получаем
новое представление чисел (рис. 4).
РИС. 4. Денормализованные числа
Интервал от 0 до 0,5 заполняют денормализованные числа, что дает воз-
можность не проваливаться в ноль в вышерассмотренных примерах (0,5 – 0,25
и 1,5 – 1,25). Это сделало представление более устойчивым к ошибкам округле-
ния для чисел, близких к нулю.
Влияние денормализованных чисел. Денормализованные числа требуют
особой обработки и, как показали эксперименты [7], это сказывается на произ-
водительности программ. Причины и масштабы падения производительности
зависят от конкретной реализации арифметики на данном оборудовании. Наибо-
лее пагубные последствия происходят в случае возникновения исключений
и программной нормализации.
ОСОБЕННОСТИ АРИФМЕТИКИ С ПЛАВАЮЩЕЙ ЗАПЯТОЙ В СОВРЕМЕННЫХ КОМПЬЮТЕРАХ
Компьютерная математика. 2016, № 1 85
Поскольку в работе [7] эксперименты проведены на весьма устаревших
процессорах, авторы решили повторить его на современном оборудовании и
проиллюстрировать в данном обзоре. Суть эксперимента в следующем: пусть
дана матрица, на краях которой заданы некоторые значения, а все остальные
элементы равны нулю. Эксперимент состоит из множества итераций, на каждой
из которых строиться новая матрица, каждый элемент которой представляет
среднее значение от соседних элементов исходной матрицы. Такой класс алго-
ритмов является характерным для конечно-разностных методов.
На рис. 5 схематически показано, как меняются элементы от итерации
к итерации. Вначале все элементы матрицы, кроме крайних, равны нулю
(рис 5, а). Далее, через несколько десятков итераций соседние элементы матри-
цы становятся настолько малыми, что их невозможно представить в нормализо-
ванном виде. Штрихом на рис. 5, б показаны обычные значения, а жирной лини-
ей – денормализованные числа. Некоторое время количество денормализован-
ных чисел растет (рис. 5, в), после чего, с уменьшением площади внутренней
границы, со временем исчезают и денормализованные числа. После определен-
ной итерации в матрице таких чисел не остается совсем (рис. 5, г).
а б в г
РИС. 5. Заполнение матрицы денормализованными числами: а – первая итерация – денорма-
лизованных чисел еще нет; б – денормализванные числа начинают появляться на
границе; в – максимальное количество денормализованных чисел в матрице;
г – денормализованных чисел в матрице снова нет
Эксперимент проведен на компьютере Intel Core 2 Duo 2.14 ГГц, использо-
вана матрица размером 500 x 500, и значение на краях V = 100, тип данных оди-
нарной точности. Отметим, что в эксперименте с двойной точностью наблюда-
ется аналогичная картина.
Из рис. 6, а, б видно, что существует явная корреляция времени вычисления
итерации и количества денормализованных чисел в матрице в этот момент. Это
показывает наличие проблем с производительностью при работе с денормализо-
ванными числами даже на современных процессорах. На пике графика ~ 6 %
чисел являются денормализованными, при этом производительность падает в
два раза. Поэтому можно оценить, что скорость работы с денормалиованными
числами будет в 30 раз медленнее, чем с обычными.
Одним из побочных эффектов эксперимента можно считать то, что на на-
чальных итерациях время вычислений в два раза ниже, чем на 1000-й. Таким
образом, работа со специальными числами (по крайней мере с нулем) в два раза
быстрее, чем с обычными числами с плавающей запятой.
Р.А. ЮЩЕНКО, А.К. ЮЩЕНКО
86 Компьютерная математика. 2016, № 1
Время вычисления итераций
0
4
8
12
16
20
1 201 401 601 801 1001
Итерация
В
ре
м
я,
м
с
Количество денормализованных чисел
0
4
8
12
16
1 201 401 601 801 1001
Итерация
N
, т
ы
ся
чи
а б
РИС. 6. Графики: а – время выполнения итераций; б – количество денормализованных чисел
на итерации
Другим примером является увеличение абсолютной погрешности при умень-
шении шага численного интегрирования, проиллюстрированной на примере вычис-
ления числа π по формуле (1). На рис. 7 показана величина абсолютной погрешно-
сти в зависимости от шага численного интегрирования.
1,00E-13
1,00E-12
1,00E-11
1,00E-10
1,00E-09
1,00E-08
1,00E-07
1,00E-06
1,00E-05
1,00E-04
1,00E-03
1,00E-02
1,00E-01
1,00E+00
1,00E-10 1,00E-08 1,00E-06 1,00E-04 1,00E-02 1,00E+00
Шаг интегрирования
Абсолютная
погрешность |π'-π|
1
20
4 (1)
1 х
РИС. 7. Погрешность численного интегрирования
Порядок чисел. Одна из особенностей представления чисел в формате
IEEE754 состоит в том, что порядок и мантисса расположены друг за другом
таким образом, что они вместе образуют последовательность целых чисел {n}
для которых выполняется:
n < n + 1 ⇒ F(n) < F(n + 1),
где F(n) – число с плавающей запятой, образованное от целого n, разбиением его
битов на порядок и мантиссу.
ОСОБЕННОСТИ АРИФМЕТИКИ С ПЛАВАЮЩЕЙ ЗАПЯТОЙ В СОВРЕМЕННЫХ КОМПЬЮТЕРАХ
Компьютерная математика. 2016, № 1 87
Поэтому, если взять положительное число с плавающей запятой, преобразо-
вать его к целому и прибавить «1», мы получим следующее число, которое
представимо в этой арифметике. На Си это можно сделать так:
float a=0.5;
int n = *((int*) &a);
float b = *((float*) &(++n));
printf("После %e следующее число: %e, разница (%e)\n", a, b, b-a);
Округление. Анализ погрешностей округления охватывает слишком широ-
кую область знаний, даже при попытке выделить наиболее важные аспекты, свя-
занные со спецификой чисел с плавающей запятой. Для подробного ознакомле-
ния смотрите книгу Хигхема [8].
Ошибочные результаты при численных расчетах в арифметике с плавающей
запятой возникают по трем причинам: погрешности исходных данных, погреш-
ности представления, погрешности, вносимые арифметическими операциями.
Последние два вида погрешностей характерны для чисел с плавающей запятой.
Погрешность представления возникает из-за того, что действительные числа
практически всегда невозможно представить в виде числа с конечным числом
разрядов. Но такая погрешность очень мала, и ее можно регулировать, выбирая
тип данных. Погрешность, вносимая арифметическими операциями, может быть
очень существенной, из-за аддитивного и мультипликативного эффектов, возни-
кающих, когда результаты одних операций используются в качестве аргументов
для других. При увеличении числа итераций погрешность растет и очень быстро
выходит за допустимые пределы.
Наиболее опасная с точки зрения погрешностей операция – вычитание раз-
нозначных чисел. Такая операция уничтожает значимые старшие разряды и уси-
ливает младшие разряды, которые представлены с погрешностью. Такая ситуа-
ция називается аннулированием. Используя алгебраические преобразования
можно существенно снизить погрешность. Для многих широко распространен-
ных математических формул разработаны специальные формы, которые позво-
ляют значительно уменьшить погрешность. Например, формулу « 2 2х y » луч-
ше вычислять следующим образом: «(x – y)(x+ y)». В этом случае аннулирова-
ние не окажет катастрофического воздействия на результат. В работах [5, 8] при-
ведено множество формул, рекомендуемых при расчете в арифметике с пла-
вающей запятой, а также теоремы, доказывающие границы погрешности.
Неассоциативность арифметических операций. Неассоциативность ариф-
метических операций над числами с плавающей запятой очевидна на следую-
щем примере:
(1020 + 1) – 1020 = 0 ≠ (1020 – 1020) + 1 = 1.
Допустим, имеем программу суммирования чисел.
double s = 0.0;
for (int i=0; i<n; i++) s = s + t[i];
Некоторые компиляторы по умолчанию могут переписать код для использо-
вания нескольких арифметико-логических устройств (АЛУ) одновременно (бу-
дем считать, что n делится на 2):
Р.А. ЮЩЕНКО, А.К. ЮЩЕНКО
88 Компьютерная математика. 2016, № 1
double sa[2], s;
sa[0]=sa[1]=0.0;
for (int i=0; i<n/2; i++) {
sa[0]=sa[0]+t[i*2+0];
sa[1]=sa[1]+t[i*2+1];
}
s=sa[0]+sa[1];
Поскольку операции суммирования не ассоциативны, эти две программы
могут выдать различный результат.
Выбор минимального значения. Допустим, из двух значений нам нужно
выбрать минимальное. В Си это можно сделать используя тернарный оператор
«?» одним из способов, приведенных в таблице.
ТАБЛИЦА. Вычисление минимума и максимума для специальных чисел
x y x < y ? x: y x <= y ? x: y x > y ? y: x x > = y ? y: x
+ 0 – 0 – 0 + 0 + 0 – 0
NaN 1 1 1 NaN NaN
Часто компилятор считает их эквивалентными и всегда использует первый
вариант, так как он выполняется за одну инструкцию процессора. Но если мы
учтем ± 0 и NaN, эти операции никак не эквивалентны.
Сравнение чисел. Очень распространенная ошибка при работе с float-ами
возникает при проверке на равенство. Например,
float fValue = 0.2;
if (fValue == 0.2) DoStuff();
Ошибка здесь, во-первых, в том, что 0,2 не имеет точного двоичного пред-
ставления, а во-вторых 0,2 – это константа двойной точности, а переменная
fValue – одинарной, и никакой гарантии о поведении этого сравнения нет.
Немного лучший, но все равно ошибочный способ, это сравнивать разницу
с допустимой абсолютной погрешностью:
if (fabs(fValue – fExpected) < 0.0001) DoStuff();
Недостаток такого подхода в том, что погрешность представления числа
увеличивается с ростом самого этого числа. Так, если программа ожидает
«10000», то приведенное равенство не будет выполняться для ближайшего
соседнего числа (10000,000977). Это особенно актуально, если в программе име-
ется преобразование из одинарной точности в двойную и/или наоборот.
Проблема выбора правильной процедуры сравнения хорошо описана в
работе Брюса Доусона [9]. В ней предлагается сравнивать числа с плавающей
запятой преобразованием к целочисленной переменной. Это – лучший способ,
хотя и работает не на любом оборудовании:
ОСОБЕННОСТИ АРИФМЕТИКИ С ПЛАВАЮЩЕЙ ЗАПЯТОЙ В СОВРЕМЕННЫХ КОМПЬЮТЕРАХ
Компьютерная математика. 2016, № 1 89
bool AlmostEqual (float A, float B, int maxUlps)
{
// maxUlps не должен быть отрицательным и не
// слишком большим, чтобы
// NaN не был равен ни одному числу
assert(maxUlps > 0 && maxUlps < 4 * 1024 * 1024);
int aInt = *(int*)&A;
// Уберем знак в aInt, если он есть,
// чтобы получить правильно
// упорядоченную последовательность
if (aInt < 0) aInt = 0x80000000 - aInt;
// Аналогично для bInt
int bInt = *(int*)&B;
if (bInt < 0) bInt = 0x80000000 - bInt;
unsigned int intDiff = abs(aInt - bInt);
if (intDiff <= maxUlps)
return true;
return false;
}
В этой программе maxUlps (от «Units-In-Last-Place») – это максимальное
количество чисел с плавающей запятой, которое может лежать между проверяе-
мым и ожидаемым значением. Другой смысл этой переменной – это количество
двоичных разрядов (начиная с младшего), в сравниваемых числах разрешается
упустить. Например, maxUlps = 16, означает, что младшие 4 бита (log216) могут
не совпадать, а числа все равно будут считаться равными. При этом, при сравне-
нии с числом 10000 абсолютная погрешность будет равна 0,0146, а при сравне-
нии с 0.001, погрешность будет менее 0.00000001 (10 – 8).
Параллельные вычисления. В параллельных вычислениях использование
чисел с плавающей запятой иногда приводит к тому, что результат вычислений
зависит от количества процессов, использованных в конкретном случае. Это
связано с различием в алгебраических свойствах арифметики действительных
чисел и арифметики чисел с плавающей запятой, которые существенно сильнее
проявляются в параллельном вычислении, поскольку в таких вычислениях для
разработки и оптимизации алгоритма широко применяются алгебраические
свойства операций (например, ассоциативность). Хорошим примером является
эксперимент, сделанный Т. Мэттсоном [10], в котором суммирование случайных
чисел в массиве из 20 тысяч элементов приводит, в зависимости от использо-
ванного числа процессов, к значительной разнице в результате. Суть проблемы
параллельной агрегации большого числа значений в том, что при разработке па-
раллельного алгоритма применяются алгебраические преобразования, исходя-
щие из ассоциативности арифметических операций. Так, формулу
n
i
ixS
1
можно переписать как
/2
1 2
1 /2 1
.
n n
i i
i i n
S S S x x
При этом частные суммы
Р.А. ЮЩЕНКО, А.К. ЮЩЕНКО
90 Компьютерная математика. 2016, № 1
можно рассчитать независимо на отдельных процессорах. Повторяя разбиение
можно получить эффективный каскадный параллельный алгоритм, который с
точки зрения арифметики с плавающей запятой содержит неоднозначности, так
как конечный результат зависит от порядка суммирования (см. п. 3.7). Это при-
водит к недетерминированности результата.
Хигхем [8] рекомендует использовать для агрегации переменную более вы-
сокой точности, чем исходные значения – это наиболее простой способ сокра-
тить погрешность округления, который, к тому же, автоматически работает в
параллельных вычислениях. Если же такой подход по какой-то причине не при-
емлем (например, значения и так представлены в максимально возможной точ-
ности), можно воспользоваться одним из рекомендованных алгоритмов «сумми-
рования с компенсацией» [11], например,
// Алгоритм Кэхэна суммирования с компенсацией
double CompensatedSum(double *x, int count)
{
s=0; e=0; temp=0; y=0;
for (i=0; i<count; i++) {
temp = s;
y = x[i] + e;
s = temp + y;
e = (temp – s) + y;
}
}
Несмотря на приведенные трудности, понимание свойств арифметики с
плавающей запятой позволяет использовать их для обеспечения точных резуль-
татов даже на пониженной разрядности. В своей параллельной библиотеке
PLASMA Д. Донгарра и его команда используют смешанную арифметику оди-
нарной и двойной точности для оптимизации скорости программы без ущерба
точности конечного результата [12].
Но не для всех задач фиксированная разрядность чисел с плавающей запя-
той подходит для достижения корректного результата. В этом случае применяют
эмулируемую арифметику с произвольной разрядностью. Скорость решения в
этом случае падает в десятки раз, зато точность решения гарантирована (если
исходные данные точны). В работах Николаевской и Чистяковой проведены ис-
следования таких задач и проиллюстрировано практическое применение эмули-
руемой арифметики [13].
Выводы. Арифметика с плавающей IEEE 754, используемая практически во
всех современных компьютерах, спроектирована таким образом, который по-
зволяет избавиться от многих странностей, возникающих при попытке пред-
ставления действительных чисел конечным числом разрядов. Не смотря на это,
так называемый «наивный подход», при котором не учитывается аксиоматика
машинной арифметики, может привести к неожиданным результатам.
ОСОБЕННОСТИ АРИФМЕТИКИ С ПЛАВАЮЩЕЙ ЗАПЯТОЙ В СОВРЕМЕННЫХ КОМПЬЮТЕРАХ
Компьютерная математика. 2016, № 1 91
Особенно следует отметить проявление недетерминированности арифмети-
ки с плавающей запятой в параллельных вычислениях при использовании кас-
кадных алгоритмов агрегации, поскольку такие алгоритмы исходят из предпо-
ложения ассоциативности, которые в этом случае не выполняются. Проблема
точности решений в параллельных компьютерах усиливается тем, что на них как
правило решаются задачи большого объема, а погрешность представления чисел
увеличивается при росте числа итераций.
Единого решения, которое смогло бы удовлетворить одновременно требо-
ваниям точности и скорости не сегодняшний день не существует, и в каждом
конкретном случае приходится искать компромиссы.
Р.А. Ющенко, О.К. Ющенко
ОСОБЛИВОСТІ АРИФМЕТИКИ З ПЛАВАЮЧОЮ КОМОЮ
НА СУЧАСНИХ КОМП’ЮТЕРАХ
Представлено короткий огляд чисел із плаваючою комою і відповідної арифметики.
Підкреслено особливості, які відрізняють її від арифметики дійсних чисел і часто є причиною
істотних проблем під час числового розв’язання задач на комп’ютері. Ці проблеми
підсилюються на даних великого обсягу і в паралельних обчисленнях. Незважаючи на все
це, мінімізувати й навіть гарантувати точність ровз’язку можливо навіть без суттєвих втрат
обчислювальної продуктивності.
R. Iushchenko, O. Iushchenko
SPECIFICITIES OF FLOATING POINT ARITHMETIC ON MODERN COMPUTERS
An overview of modern floating point arithmetic is presented. The aspects, which are different from
real numbers arithmetic, and, thus, cause a lot of numeric problems are outlined. These problems
become substantial on large amounts of data and in parallel computations. Nevertheless, it is possi-
ble to guarantee the required accuracy of the results without considerable loss of performance.
1. Молчанов И.Н. Машинная математика. Проблемы и перспективы // Кибернетика и сис-
темный анализ. – 2004. – № 6. – С. 65 – 72.
2. Молчанов И.Н., Перевозчикова О.Л., Химич А.Н. Опыт разработки семейства кластерных
комплексов Инпарком // Там же. – 2009. – № 6. – С. 88 – 96.
3. http://www.cs.unc.edu/~ibr/projects/paranoia/.
4. http://software.intel.com/en-us/videos/tim-mattson-floating-points-arent-real/.
5. Goldberg D. What Every Computer Scientist Should Know About Floating-Point Arithmetic //
ACM Computing Surveys. – 1991. – Vol. 1, N 23. – P. 5 – 48.
6. IEEE 754-2008 Standard for Floating-Point Arithmetic.
7. Bjørndalen J.M., Anshus O.J. Trusting floating point benchmarks - are your benchmarks really
data independent?, Proceedings of the 8th international conference on Applied parallel
computing: state of the art in scientific computing, June 18 – 21, 2006, Umeå, Sweden.
8. Higham N. Accuracy and Stability of Numerical Algorithms. – Philadelphia: 2002, SIAM. –
Р. 680.
Р.А. ЮЩЕНКО, А.К. ЮЩЕНКО
92 Компьютерная математика. 2016, № 1
9. Bruce Dawson,
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
10. Tim Mattson,
http://software.intel.com/en-us/videos/tim-mattson-floating-points-arent-real/.
11. Kahan W. Implementation of algorithms. Technical Report 20, Department of Computer
Science, University of California, Berkeley, CA, USA, 1973.
12. Buttari A., Dongarra J., Kurzak J., Luszczek P., Tomov S. "Using Mixed Precision for Sparse
Matrix Computations to Enhance the Performance while Achieving 64-bit Accuracy," ACM
Transactions on Mathematical Software. – 2008. – Vol. 34, N 4. – Р. 17 – 22.
13. Николаевская Е.А., Чистякова Т.В. Программно-алгоритмические методы повышения
точности компьютерных решений // Кибернетика и системный анализ. – 2009. – № 6. –
С. 172 – 176.
Получено 15.03.2016
Об авторах:
Ющенко Руслан Андреевич,
кандидат физико-математических наук, старшый научный сотрудник
Института кибернетики имени В.М. Глушкова НАН Украины,
Ющенко Александра Константиновна,
младшый научный сотрудник
Института кибернетики имени В.М. Глушкова НАН Украины.
|
| id | nasplib_isofts_kiev_ua-123456789-168401 |
| institution | Digital Library of Periodicals of National Academy of Sciences of Ukraine |
| issn | 2616-938Х |
| language | Russian |
| last_indexed | 2025-12-07T15:41:21Z |
| publishDate | 2016 |
| publisher | Інститут кібернетики ім. В.М. Глушкова НАН України |
| record_format | dspace |
| spelling | Ющенко, Р.А. Ющенко, А.К. 2020-05-01T15:57:05Z 2020-05-01T15:57:05Z 2016 Особенности арифметики с плавающей запятой в современных компьютерах / Р.А. Ющенко, А.К. Ющенко // Компьютерная математика. — 2016. — № 1. — С. 80-92. — Бібліогр.: 13 назв. — рос. 2616-938Х https://nasplib.isofts.kiev.ua/handle/123456789/168401 004 Представлен краткий обзор чисел с плавающей запятой и соответствующей арифметики. Подчеркнуты особенности, которые отличают ее от арифметики действительных чисел и часто являются причиной существенных проблем при численном решении задач на компьютере. Эти проблемы усиливаются на больших объемах данных и параллельных вычислениях. Несмотря на все это, минимизировать и даже гарантировать точность решений возможно даже без существенных потерь в производительности. Представлено короткий огляд чисел із плаваючою комою і відповідної арифметики. Підкреслено особливості, які відрізняють її від арифметики дійсних чисел і часто є причиною істотних проблем під час числового розв’язання задач на комп’ютері. Ці проблеми підсилюються на даних великого обсягу і в паралельних обчисленнях. Незважаючи на все це, мінімізувати й навіть гарантувати точність ровз’язку можливо навіть без суттєвих втрат обчислювальної продуктивності. An overview of modern floating point arithmetic is presented. The aspects, which are different from real numbers arithmetic, and, thus, cause a lot of numeric problems are outlined. These problems become substantial on large amounts of data and in parallel computations. Nevertheless, it is possible to guarantee the required accuracy of the results without considerable loss of performance. ru Інститут кібернетики ім. В.М. Глушкова НАН України Компьютерная математика Оптимизация вычислений Особенности арифметики с плавающей запятой в современных компьютерах Особливості арифметики з плаваючою комою на сучасних комп’ютерах Specificities of floating point arithmetic on modern computers Article published earlier |
| spellingShingle | Особенности арифметики с плавающей запятой в современных компьютерах Ющенко, Р.А. Ющенко, А.К. Оптимизация вычислений |
| title | Особенности арифметики с плавающей запятой в современных компьютерах |
| title_alt | Особливості арифметики з плаваючою комою на сучасних комп’ютерах Specificities of floating point arithmetic on modern computers |
| title_full | Особенности арифметики с плавающей запятой в современных компьютерах |
| title_fullStr | Особенности арифметики с плавающей запятой в современных компьютерах |
| title_full_unstemmed | Особенности арифметики с плавающей запятой в современных компьютерах |
| title_short | Особенности арифметики с плавающей запятой в современных компьютерах |
| title_sort | особенности арифметики с плавающей запятой в современных компьютерах |
| topic | Оптимизация вычислений |
| topic_facet | Оптимизация вычислений |
| url | https://nasplib.isofts.kiev.ua/handle/123456789/168401 |
| work_keys_str_mv | AT ûŝenkora osobennostiarifmetikisplavaûŝeizapâtoivsovremennyhkompʹûterah AT ûŝenkoak osobennostiarifmetikisplavaûŝeizapâtoivsovremennyhkompʹûterah AT ûŝenkora osoblivostíarifmetikizplavaûčoûkomoûnasučasnihkompûterah AT ûŝenkoak osoblivostíarifmetikizplavaûčoûkomoûnasučasnihkompûterah AT ûŝenkora specificitiesoffloatingpointarithmeticonmoderncomputers AT ûŝenkoak specificitiesoffloatingpointarithmeticonmoderncomputers |