Линейная алгебра для студентов-машиностроителей. В 2 частях. Ч.1. Учебное пособие
.pdfниже определенного уровня, иначе единица). Но на практике можно использовать несколько пороговых уровней напряжения и хранить больше информации в одной ячейке. Из-за необходимости сравнения с несколькими числами и из-за возможных ошибок при их считывании производительность и надежность такой памяти может быть ниже, а стоимость меньше. Поскольку полученная информация из каждой ячейки далее будет использоваться совместно, то на более высоком уровне абстракции не так важно, сколько реально хранится бит в ячейке памяти. Поэтому условимся считать, что каждая ячейка памяти хранит ровно 1 бит.
Для файлов на компьютере чаще используют единицу хранения информациибайт (отангл.byte)–совокупностьиз8бит.Чтобыза- кодировать символы в строках (вариантов символов много – буквы разных алфавитов, цифры, знаки препинания, служебные символы), необходимо несколько бит. К моменту стандартизации договорились о 8 битах в одном байте, что и принято в настоящее время.
Обычноданныезанимаютвпамятимногобит,поэтомуиспользуют приставки из СИ (кило- , мега-, гига-, тера-). При применении русскоязычных приставок в бите и байте возникает путаница, когда в чем 1000, а в чем 1024 [15].
Возвращаемся к абстрактной организации памяти. Ее можно представить в первом приближении как ленту, вырезанную из клетчатой бумаги, где каждая клетка содержит нуль или единицу. На самом деле таких лент несколько.
Система памяти образует иерархию устройств хранения с разными емкостями, стоимостью и временем доступа (рис. 2.1 [16]). Вычислительные операции проводятся с числами, находящимися в ячейках очень быстрой, но маленькой по объему памяти внутри процессора, называемой регистрами (от англ. registers). Небольшие быстрые кэш-памяти (от англ. cache), расположенные внутри процессора, служат буферными зонами, которые, в свою очередь, хранят маленькую часть данных, расположенных в более медлен-
ной,нобольшойоперативнойпамяти (отангл.random-accessmem- ory, RAM) [17]. Она же служит буфером для относительно медленных, но вместительных локальных дисков (от англ. local drive). Это
31
могут быть твердотельные накопители (от англ. solid-state drive, SSD) [18], накопители на жестких магнитных дисках (от англ. hard diskdrive,HDD)[19]илидажеленточныенакопители(отангл.tape drive) [20]. Такая иерархия памяти неплохо работает, потому что грамотно написанные программы имеют тенденцию обращаться к хранилищу на каком-то конкретном уровне более часто, чем к хранилищу на более низком уровне. Поэтому хранилище на более низком уровне может быть медленнее, больше и дешевле. В итоге мы получаем большой объем памяти, который имеет стоимость не сильнодорожехранилищавсамомнизуиерархии,нодоступкней осуществляется со скоростью быстрого хранилища в самом верху иерархии(разумеется,видеальнойситуации)[21].Втабл.2.1представленыобъемивремядоступа(от англ. latency)кразличнымвидам памяти на современном персональном компьютере.
Про эффективное использование иерархической организации памяти можно написать еще одну главу, но здесь ограничимся несколькими замечаниями [25].
Для быстрой работы кода необходимо держать рабочие данные в оперативной памяти и максимально ограничить запись на диск. Нужно минимизировать количество выделений оперативной памяти. Если возможно, то предварительно необходимо рассчитать и единожды выделить требуемую память под массивы данных вместо нескольких ее выделений в процессе выполнения кода.
Рис. 2.1. Иерархическая модель памяти
32
|
|
Таблица 2.1 |
Размер и время доступа к некоторым видам памяти |
||
|
на компьютере [22–24] |
|
|
|
|
Вид памяти |
Размер |
Время доступа |
Регистры |
Несколько килобайт |
Несколько сотен |
|
на ядро CPU |
пикосекунд (10–12 с) |
L1 кэш |
32–48 KB на ядро CPU |
Примерно 1 наносе- |
|
|
кунда (10–9 с) |
L2 кэш |
256 кB – 1,25 MB на |
3–10 наносекунд |
|
ядро CPU |
|
L3 кэш |
8–64 MB суммарно на |
10–20 наносекунд |
|
все ядра CPU |
|
Оперативная память |
8–128 GB |
50–100 наносекунд |
|
|
|
Твердотельные |
128 GB – 8 TB |
20–200 микросекунд |
накопители |
|
(10–6 с) |
Накопители на жест- |
1–20 TB |
5–10 миллисекунд |
ких магнитных дисках |
|
(10–3 с) |
Эффективное использование кэша процессора сводится к локальности: временной (данные, к которым недавно обращались, скорее всего, уже находятся в кэше) и пространственной (соседние к запрошенным данные из оперативной памяти тоже помещаются в кэш). Поэтому читать данные из оперативной памяти нужно последовательно, а не в случайном порядке. Если необходимо получить доступ к данным памяти часто, то лучше хранить их в кэшпамяти. Данные необходимо выравнивать в памяти и работать с ними, ориентируясь на размер кэш-линий [26].
2.3. Представление целых и рациональных чисел
Объединениеданных(значения бит 0или 1) из выбранных ячеек приводит к целому положительному числу, записанному в двоичнойсистемесчисления.Однакотакихчиселбесконечномного– что делать?
33
Память компьютера ограничена, поэтому мы работаем только с такими числами, которые можно представить в фиксированном количестве разрядов. Для представления целых чисел (как, впрочем, справедливо и для действительных) нужно решить:
1)каким будет фиксированное количество байт, выделяемых под число (обычно 1, 2, 4 или 8). Например, использование 4 байт на число позволяет хранить 24 8 = 232 различных значений.
2)храним мы только неотрицательные числа или еще и отрицательные (для байт это дает диапазоны 0–232–1 или –231–231–1).
3)в каком порядке байты записываются в памяти компьютера
(англ. endianness) [27]).
Операции с целыми числами описаны в [28, 29]. Основные проблемы, возникающие при работе с ними на компьютере, – это переполнение при любых арифметических операциях (кроме деления у беззнаковых) и потеря точности при округлении результата при делении чисел с остатком.
Пример 2.2. Используя MATLAB, проверить результаты операций с числами а = 232–1 и b=7, хранимых как беззнаковые целые
числа размером 4 байта: a+1;1−b; ab; ab b.
Решение
MATLAB: clear
a = uint32(4294967295);
b=uint32(7);%uint32–беззнаковоецелоечислоразмером4байта
(32 бита)
a + 1 % при переполнении поведение зависит от договоренности, 1–b%вMATLABостаетсямаксимальное/минимальноезначение для типа
a * b
(a/b) * b % деление с остатком приводит к потере точности.
Приработесрациональнымичисламиихчислительизнаменательможнохранитьотдельнокакцелыечисла.Приэтомоперации реализуются с помощью программного кода.
34
Когда имеющегося диапазона для представления целых чисел недостаточно(например,нужновычислитьфакториалотбольшого числа),томожноиспользоватьтакназываемуюдлиннуюарифмети-
ку (от англ. arbitrary-precision arithmetic, или variable-precision arithmetic). Операции осуществляются с помощью программного кода, а хранение числа осуществляется в виде массива из его цифр, или степеней в разложении на простые числа, или остатков от деления наних[30].Использоватьсяэтоможет,например,вкриптографии. Большинствосистемподписыванияишифрованияданныхприменяют целочисленную арифметику по модулю n, где n – очень большое натуральное число (например, в алгоритме RSA 22048 [31]).
Пример2.3.ИспользуядлиннуюарифметикувMATLAB,найти значение 100!.
Решение
MATLAB: clear
digits = 200; % число знаков взято с запасом a = vpa(factorial(100), digits)
2.4. Представление действительных и комплексных чисел
Поле действительных чисел содержит бесконечно много элементов, и мощность множества чисел, его составляющих, больше множества натуральных чисел. Отсюда следует, что в отличие от целых чисел, где можно подбирать диапазон, в котором они варьируются, какойбымаленькийинтервалнивзятьикакмногобайтподхранение ни выделить – мы неизбежно столкнемся с числами, не имеющими точногопредставления.Поэтомудляпредставлениядействительных чисел приходится использовать подмножество рациональных чисел. Помимо ранее упомянутого варианта хранения отдельно числителя и знаменателя дроби можно заранее договориться, в каком разряде ставится разделитель целой и дробной части.
Какразделительвнекоторыхстранахвыступаетточка,вдругих– запятая. Мы будем использовать разделитель «.» в коде, а в названиях – сложившуюся русскоязычную терминологию с запятой.
35
Если нужно иметь n значащих цифр по основанию B (обычно 2 или 10) после разделителя, то число можно представить в виде M B−n, где M – целое число, которое хранится в памяти. Такой подход называется числа с фиксированной запятой (от англ. fixedpoint number).
Но диапазон чисел, используемых при вычислениях, может оказаться очень большим. Например, в астрономические вычисления может включаться масса электрона (≈9 10−31 килограмм) и масса Солнца (≈ 2 1030 килограмм). Разница здесь превышает 60 порядков!Использованиечиселсфиксированнойзапятойстаким количеством значащих цифр не очень рационально – ведь результаты вычислений, скорее всего, окажутся намного большими/ меньшими,исовсемнезачемхранитьстольколишнихихразрядов впамятиуцелойидробнойчастейчисла.Поэтомудляпредставления действительных чисел нужна такая система, в которой диапазон выражаемых чисел не зависит от числа значимых разрядов. Числа с плавающей запятой – один из способов представления действительных чисел, который является компромиссом между точностью представления (от англ. accuracy), диапазоном принимаемых значений (от англ. range), скоростью работы, требуемым объемом памяти и сложностью реализации.
Число с плавающей запятой (от англ. floating-point number) со-
стоитизнабораразрядов,условноразделенныхназнак,порядоки мантиссу [32] (рис. 2.2): (−1)s M BE, где s – знак; B – основание;
E – порядок; M – мантисса.
Основание В (от англ. base) определяет систему счисления разрядов.Доказано,чточисласплавающейзапятойсбазойB = 2 (двоичное представление) наиболее устойчивы к ошибкам округления, поэтому на практике обычно используют ее (реже полагают
Знак Порядок Мантисса
0
Рис. 2.2. Схема двоичного представления числа с плавающей запятой
36
B = 10) [33]. Далее будем полагать, что B = 2. Отсюда формула числа с плавающей запятой будет иметь вид (−1)s M 2E.
Мантисса и порядок (от англ. mantissa и exponent) – это целые числа фиксированной длины, которые представляют собой соответственно старшие разряды действительного числа и степень старшего разряда.
Пример2.4.Найтимантиссучисла2,5дляслучая,когдамантисса состоит из 4 бит, а порядок принимает значения 2 и 1.
Решение: 2,510 =1 21 +0 20 +1 2−1 =10,12.
Для E = 2 0 22 +1 21 +0 20 +1 2−1 =010,12 M =01012. Для E =1 1 21 +0 20 +1 2−1 +0 2−2 =101,02 M =10102.
Из примера 2.4 следует, что, регулируя E, одно и то же число можно представить по-разному. Это неудобно для оборудования, так как нужно учитывать множественность представления при сравнении чисел и при выполнении над ними арифметических операций. Кроме того, это не экономично, поскольку число представлений конечное, а повторения уменьшают множество чисел, которые вообще могут быть представлены. Выйти из положения можно,сделавпервыйбитмантиссывсегдаположительным.Такое представление назвали нормализованным: (−1)s 1M 2E .
Это экономит один бит (поскольку неявную единицу не нужно хранить в памяти) и обеспечивает уникальность представления числа. Однако в таком виде не представить нуль. Поэтому исполь-
зуется и денормализованный вид: (−1)s 0M 2E.
Этот вид применяют не только для нуля, но и для более равномерного представления чисел около него. Рассмотрим вариант, когда под мантиссу M выделено 2 бита + фиксированный 1 бит нормализации, диапазон значений порядка E – 1…+ 2(тоже выделено2бита),аs =0–положительныечисла.Здесьможнопредста- вить16различныхчисел.Изобразимихсинимцветомначисловой прямой (рис. 2.3).
Крупными штрихами показаны числа с M = 100 2, например:
0,5=1 2−1 +0 2−2 +0 2−3. Самое большое число 7 получают так: 12 2 +1 2 1 +1 2 0.
37
0 |
0,5 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
|
|
Рис. 2.3. Нормализованные числа на числовой прямой |
|
||||||
|
|
|
|
|
|
|
|
|
|
0 |
0,5 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
Рис. 2.4. Нормализованные и денормализованные числа
Видно (см. рис. 2.3), что расстояние от 0 до ближайшего числа 0,5 больше, чем от числа 0,5 до следующего числа 0,625. Это означает, что разница двух любых чисел, отличающихся меньше чем на 0,5, даст 0, даже если данные числа не равны. Но и нуль надо както хранить.
Для того чтобы решить эту проблему, возьмем минимальное значение E и дополним диапазон денормализованными (субнор- мальными) числами этого порядка:
0 =0 2−1 +0 2−2 +0 2−3;
0,125=0 2−1 +0 2−2 +1 2−3; 0,25=0 2−1 +1 2−2 +0 2−3; 0,375=0 2−1 +1 2−2 +1 2−3.
Отметим их на числовой прямой зеленым цветом (рис. 2.4).
Это представление более устойчиво к ошибкам округления для чисел, близких к нулю, – теперь разность любых двух чисел (или сумма положительного и отрицательного числа) равна нулю, только еслионисамиравнымеждусобой,чтоважнодлякорректнойработы вычислительных алгоритмов [34]. Но при этом придется уменьшить на единицу диапазон возможных значений E, оставаясь в прежних ограничениях по памяти. И, что более важно, появляются дополнительные сложности при арифметических операциях с такими числамивпроцессоре[35].Темнеменееэтокомпромиссмеждуточностью представления чисел, диапазоном и скоростью работы с ними.
Впринципепорядоквпредставлениичисламожетбытькакположительным, так и отрицательным. Чтобы не вводить бит знака
38
порядка, используют смещенный порядок, прибавляя к порядку смещение, равное 2l−1 −1, где l – число разрядов, отведенное под смещенный порядок. Например, если под порядок отведен 1 байт, то смещение 28−1 −1=127. Если порядок равен +4, то смещенный порядок 4+127=131. Если порядок равен –4, то смещенный по-
рядок −4+127=123.
Комплексные числа можно хранить как пару действительных чисел и осуществлять операции с ними с помощью программного кода по обычным правилам.
В заключение необходимо определить количество бит под хранение порядка и мантиссы, исходя из требуемой точности и диапазона значений, и решить, как проводить арифметические операциисчислами,записаннымивтакойформе,икакобрабатывать исключения этих операций (например, деление на нуль).
2.5. Стандарт представления чисел IEEE-754–2019
Стандарт представления чисел IEEE-754–2019 описан в [36]. Вначале рассмотрим представление чисел.
2.5.1.Представление чисел
Встандарте рассмотрено представление чисел по основанию B, равному 2 или 10. Используется подход, изложенный в разделе 2.4 (табл. 2.2 и 2.3).
Из табл. 2.2 следует, что у нуля есть знак (это пригодится далее
варифметических операциях) и используются специальные числа для обработки исключений арифметических операций: ∞ и NaN.
Втабл. 2.3 представлены наиболее популярные типы чисел с плавающей запятой с одинарной точностью (англ. binary32, float, или single) и с двойной точностью (англ. binary64, или double). Порядок отвечает за диапазон представления чисел, мантисса – за
точность. Число εм называется машинным эпсилоном – максимальное положительное число, для которого верно равенство 1 + ε = 1. Оно связано с относительной погрешностью представления чисел с плавающей запятой. Рассмотрим число a, его приближенное
39
|
|
|
Таблица 2.2 |
Представление обычных и специальных чисел |
|||
|
|
|
|
Объект |
Знак |
Порядок |
Мантисса |
Нормализированное |
± |
00...00 < E < 11...11 |
Любой набор бит |
число |
|
|
|
Денормализированное |
± |
00...00 |
Любой ненулевой |
число |
|
|
набор бит |
Нуль |
± |
00...00 |
00...00 |
Бесконечность ∞ |
± |
11...11 |
00...00 |
Не число * NaN |
± |
11...11 |
Любой ненулевой |
|
|
|
набор бит |
__________
* Не число – от англ. not a number.
|
|
|
|
|
|
|
|
|
|
Таблица 2.3 |
|||
|
Числа с плавающей запятой |
|
|
|
|
|
|||||||
|
|
|
|
||||||||||
Характеристика |
Одинарная точность |
Двойная точность |
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|||
Всего бит |
|
|
32 |
|
|
|
|
64 |
|
|
|||
Бит: |
|
|
|
|
|
|
|
|
|
|
|
|
|
на знак |
|
|
1 |
|
|
|
|
1 |
|
|
|||
на порядок |
|
|
8 |
|
|
|
|
11 |
|
|
|||
на мантиссу |
|
|
23 |
|
|
|
|
52 |
|
|
|||
Несмещенный |
От –126 до +127 |
|
От –1022 до +1023 |
|
|||||||||
порядок |
|
|
|
|
|
|
|
|
|
|
|
|
|
Смещение |
|
|
127 |
|
|
|
|
1023 |
|
|
|||
Наименьшее |
2−126 ≈1,18 10−38 |
2−1022 ≈ 2,2 10−308 |
|||||||||||
нормализирован- |
|
|
|
|
|
|
|
|
|
|
|
|
|
ное число |
|
|
|
|
|
|
|
|
|
|
|
|
|
Наибольшее |
(2 |
0 |
+…+2 |
−23 |
127 |
= |
(2 |
0 |
+…+2 |
−52 |
1023 |
= |
|
нормализирован- |
|
|
)2 |
|
|
)2 |
|||||||
=(2−2−23 )2127 ≈3,4 1038 |
=(2−2−52 )21023 ≈1,8 10308 |
||||||||||||
ное число |
|||||||||||||
Наименьшее |
2−23 2−126 ≈1,4 10−45 |
2−52 2−1022 ≈4,94 10−324 |
|||||||||||
субнормальное |
|
|
|
|
|
|
|
|
|
|
|
|
|
число |
|
|
|
|
|
|
|
|
|
|
|
|
|
Относительная |
εм = 2−23 ≈1,19 10−7 |
εм = 2−52 ≈ 2,22 10−16 |
|||||||||||
погрешность |
|
|
|
|
|
|
|
|
|
|
|
|
|
представления |
|
|
|
|
|
|
|
|
|
|
|
|
|
40
