07a2b481 (kx 2024-12-28 08:20:38 +0300 1) .\" Copyright 2024 Andrew V.Kosteltsev (kx@radix-linux.su)
07a2b481 (kx 2024-12-28 08:20:38 +0300 2) .\"
07a2b481 (kx 2024-12-28 08:20:38 +0300 3) .\"
07a2b481 (kx 2024-12-28 08:20:38 +0300 4) .TH LIBMPU 7 "December 27, 2024" "libmpu" "libmpu Programmer's Manual"
07a2b481 (kx 2024-12-28 08:20:38 +0300 5) .SH NAME
07a2b481 (kx 2024-12-28 08:20:38 +0300 6) libmpu \- Math Processor Unit Library (libmpu).
07a2b481 (kx 2024-12-28 08:20:38 +0300 7) .SH DESCRIPTION
07a2b481 (kx 2024-12-28 08:20:38 +0300 8) Библиотека выполнена как эмулятор процессора с набором регистров и флагов, устанавливаемых
07a2b481 (kx 2024-12-28 08:20:38 +0300 9) по результатам проведенных операций. Набор целочисленных функций содержит арифметические,
07a2b481 (kx 2024-12-28 08:20:38 +0300 10) логические операции, а также всевозможные операции сдвига. Для вещественных и комплексных
07a2b481 (kx 2024-12-28 08:20:38 +0300 11) чисел реализованы основные тригонометрические функции.
07a2b481 (kx 2024-12-28 08:20:38 +0300 12) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 13) Разрядность ограничена \fB65536\fP бит для арифметических операций и \fB16384\fP бит для
07a2b481 (kx 2024-12-28 08:20:38 +0300 14) тригонометрии. Ограничения обусловлены порядком рядов аппроксимации.
07a2b481 (kx 2024-12-28 08:20:38 +0300 15) .SH Форматы данных
07a2b481 (kx 2024-12-28 08:20:38 +0300 16) Библиотека поддерживает целые, вещественные и комплексные типы. Переменные хранятся
07a2b481 (kx 2024-12-28 08:20:38 +0300 17) в массивах байтов.
07a2b481 (kx 2024-12-28 08:20:38 +0300 18) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 19) .SS Целые числа
07a2b481 (kx 2024-12-28 08:20:38 +0300 20) В заголовочном файле \fBlibmpu.h\fP определены константы, которые представляют количество
07a2b481 (kx 2024-12-28 08:20:38 +0300 21) байтов для хранения целых переменных:
07a2b481 (kx 2024-12-28 08:20:38 +0300 22) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 23) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 24) #define NB_I8 1
07a2b481 (kx 2024-12-28 08:20:38 +0300 25) #define NB_I16 2
07a2b481 (kx 2024-12-28 08:20:38 +0300 26) #define NB_I32 4
07a2b481 (kx 2024-12-28 08:20:38 +0300 27) #define NB_I64 8
07a2b481 (kx 2024-12-28 08:20:38 +0300 28) #define NB_I128 16
07a2b481 (kx 2024-12-28 08:20:38 +0300 29) #define NB_I256 32
07a2b481 (kx 2024-12-28 08:20:38 +0300 30) #define NB_I512 64
07a2b481 (kx 2024-12-28 08:20:38 +0300 31) #define NB_I1024 128
07a2b481 (kx 2024-12-28 08:20:38 +0300 32) #define NB_I2048 256
07a2b481 (kx 2024-12-28 08:20:38 +0300 33) #define NB_I4096 512
07a2b481 (kx 2024-12-28 08:20:38 +0300 34) #define NB_I8192 1024
07a2b481 (kx 2024-12-28 08:20:38 +0300 35) #define NB_I16384 2048
07a2b481 (kx 2024-12-28 08:20:38 +0300 36) #define NB_I32768 4096
07a2b481 (kx 2024-12-28 08:20:38 +0300 37) #define NB_I65536 8192
07a2b481 (kx 2024-12-28 08:20:38 +0300 38) #define NB_I_MAX 8192
07a2b481 (kx 2024-12-28 08:20:38 +0300 39) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 40) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 41) Данные константы можно использовать в качестве значения аргумента \fBnb\fP для операций
07a2b481 (kx 2024-12-28 08:20:38 +0300 42) с целыми числами.
07a2b481 (kx 2024-12-28 08:20:38 +0300 43) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 44) В системах с \fBbig\-endian\fP порядком байтов старший байт числа хранится по наименьшему
07a2b481 (kx 2024-12-28 08:20:38 +0300 45) адресу памяти, а младший байт — по наибольшему. В системе с \fBlittle\-endian\fP порядком
07a2b481 (kx 2024-12-28 08:20:38 +0300 46) байтов, напротив, младший байт хранится по наименьшему адресу.
07a2b481 (kx 2024-12-28 08:20:38 +0300 47) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 48) На следующей схеме представлено размещение целого числа в зависимости от архитектуры
07a2b481 (kx 2024-12-28 08:20:38 +0300 49) машины:
07a2b481 (kx 2024-12-28 08:20:38 +0300 50) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 51) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 52) if( MPU_BYTE_ORDER_BIG_ENDIAN == 0 )
07a2b481 (kx 2024-12-28 08:20:38 +0300 53) {
07a2b481 (kx 2024-12-28 08:20:38 +0300 54) [NB-1], . . . , [0];
07a2b481 (kx 2024-12-28 08:20:38 +0300 55) ┌─────────────────────────── . . . ───────────────────────────┐
07a2b481 (kx 2024-12-28 08:20:38 +0300 56) │ high low │
07a2b481 (kx 2024-12-28 08:20:38 +0300 57) └─────────────────────────── . . . ───────────────────────────┘
07a2b481 (kx 2024-12-28 08:20:38 +0300 58) ^Sign bit
07a2b481 (kx 2024-12-28 08:20:38 +0300 59) size: NB.
07a2b481 (kx 2024-12-28 08:20:38 +0300 60) }
07a2b481 (kx 2024-12-28 08:20:38 +0300 61)
07a2b481 (kx 2024-12-28 08:20:38 +0300 62) if( MPU_BYTE_ORDER_BIG_ENDIAN == 1 )
07a2b481 (kx 2024-12-28 08:20:38 +0300 63) {
07a2b481 (kx 2024-12-28 08:20:38 +0300 64) [0], . . . , [NB-1];
07a2b481 (kx 2024-12-28 08:20:38 +0300 65) ┌─────────────────────────── . . . ───────────────────────────┐
07a2b481 (kx 2024-12-28 08:20:38 +0300 66) │ high low │
07a2b481 (kx 2024-12-28 08:20:38 +0300 67) └─────────────────────────── . . . ───────────────────────────┘
07a2b481 (kx 2024-12-28 08:20:38 +0300 68) ^Sign bit
07a2b481 (kx 2024-12-28 08:20:38 +0300 69) size: NB.
07a2b481 (kx 2024-12-28 08:20:38 +0300 70) }
07a2b481 (kx 2024-12-28 08:20:38 +0300 71) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 72) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 73) Здесь, символ \fBNB\fP — обозначает количество байтов числа.
07a2b481 (kx 2024-12-28 08:20:38 +0300 74) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 75) Для представления целых переменных, пользователь может самостоятельно создавать массивы
07a2b481 (kx 2024-12-28 08:20:38 +0300 76) байтов любым из перечисленных ниже способов:
07a2b481 (kx 2024-12-28 08:20:38 +0300 77) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 78) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 79) __mpu_byte_t a[NB_I65536];
07a2b481 (kx 2024-12-28 08:20:38 +0300 80) mpu_int a[NB_I65536];
07a2b481 (kx 2024-12-28 08:20:38 +0300 81)
07a2b481 (kx 2024-12-28 08:20:38 +0300 82) mpu_int *a = (mpu_int *)malloc( NB_I65536 * sizeof(__mpu_byte_t) );
07a2b481 (kx 2024-12-28 08:20:38 +0300 83) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 84) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 85) а также использовать, предопределенные в \fBlibmpu.h\fP, типы данных, которые прямо
07a2b481 (kx 2024-12-28 08:20:38 +0300 86) говорят о размерности:
07a2b481 (kx 2024-12-28 08:20:38 +0300 87) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 88) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 89) mpu_int4096_t a;
07a2b481 (kx 2024-12-28 08:20:38 +0300 90) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 91) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 92) Целые числа могут рассматриваться как знаковые (\fIsigned\fP), так и беззнаковые (\fIunsigned\fP).
07a2b481 (kx 2024-12-28 08:20:38 +0300 93) Знаковые переменные, для удобства операций с ними, представляются в дополнительном коде.
07a2b481 (kx 2024-12-28 08:20:38 +0300 94) Ниже приведена таблица некоторых значений 8\-разрядной переменной в дополнительном коде.
07a2b481 (kx 2024-12-28 08:20:38 +0300 95) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 96) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 97) ┌────────────────┬─────────────────┐
07a2b481 (kx 2024-12-28 08:20:38 +0300 98) │ Десятичное │ Двоичное │
07a2b481 (kx 2024-12-28 08:20:38 +0300 99) │ представление │ представление │
07a2b481 (kx 2024-12-28 08:20:38 +0300 100) ├────────────────┼─────────────────┤
07a2b481 (kx 2024-12-28 08:20:38 +0300 101) │ 127 │ 0111 1111 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 102) │ 3 │ 0000 0011 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 103) │ 2 │ 0000 0010 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 104) │ 1 │ 0000 0001 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 105) │ 0 │ 0000 0000 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 106) │ -1 │ 1111 1111 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 107) │ -2 │ 1111 1110 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 108) │ -3 │ 1111 1101 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 109) │ -127 │ 1000 0001 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 110) │ -128 │ 1000 0000 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 111) └────────────────┴─────────────────┘
07a2b481 (kx 2024-12-28 08:20:38 +0300 112) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 113) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 114) .SS Вещественные числа
07a2b481 (kx 2024-12-28 08:20:38 +0300 115) Вещественные переменные, также как и целые, хранятся в виде массивов байтов.
07a2b481 (kx 2024-12-28 08:20:38 +0300 116) В заголовочном файле \fBlibmpu.h\fP определены константы, которые представляют
07a2b481 (kx 2024-12-28 08:20:38 +0300 117) количество байтов для хранения вещественных переменных:
07a2b481 (kx 2024-12-28 08:20:38 +0300 118) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 119) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 120) #define NB_R32 4
07a2b481 (kx 2024-12-28 08:20:38 +0300 121) #define NB_R64 8
07a2b481 (kx 2024-12-28 08:20:38 +0300 122) #define NB_R128 16
07a2b481 (kx 2024-12-28 08:20:38 +0300 123) #define NB_R256 32
07a2b481 (kx 2024-12-28 08:20:38 +0300 124) #define NB_R512 64
07a2b481 (kx 2024-12-28 08:20:38 +0300 125) #define NB_R1024 128
07a2b481 (kx 2024-12-28 08:20:38 +0300 126) #define NB_R2048 256
07a2b481 (kx 2024-12-28 08:20:38 +0300 127) #define NB_R4096 512
07a2b481 (kx 2024-12-28 08:20:38 +0300 128) #define NB_R8192 1024
07a2b481 (kx 2024-12-28 08:20:38 +0300 129) #define NB_R16384 2048
07a2b481 (kx 2024-12-28 08:20:38 +0300 130) #define NB_R32768 4096
07a2b481 (kx 2024-12-28 08:20:38 +0300 131) #define NB_R65536 8192
07a2b481 (kx 2024-12-28 08:20:38 +0300 132) #define NB_R_MAX 8192
07a2b481 (kx 2024-12-28 08:20:38 +0300 133) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 134) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 135) Данные константы можно использовать в качестве значения аргумента \fBnb\fP для
07a2b481 (kx 2024-12-28 08:20:38 +0300 136) операций с вещественными числами.
07a2b481 (kx 2024-12-28 08:20:38 +0300 137) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 138) Вещественные числа имеют в своем составе два поля: смещенной экспоненты и мантиссы.
07a2b481 (kx 2024-12-28 08:20:38 +0300 139) Бит целой единицы неявный. Знак расположен в старшем бите числа.
07a2b481 (kx 2024-12-28 08:20:38 +0300 140) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 141) На следующей схеме представлено размещение вещественного числа в зависимости
07a2b481 (kx 2024-12-28 08:20:38 +0300 142) от архитектуры машины:
07a2b481 (kx 2024-12-28 08:20:38 +0300 143) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 144) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 145) if( MPU_BYTE_ORDER_BIG_ENDIAN == 0 )
07a2b481 (kx 2024-12-28 08:20:38 +0300 146) {
07a2b481 (kx 2024-12-28 08:20:38 +0300 147) [NB-1], . . . , [nS] │ [nS-1], . . . , [0];
07a2b481 (kx 2024-12-28 08:20:38 +0300 148) ┌────── . . . ───────┬─────────────── . . . ──────────────────┐
07a2b481 (kx 2024-12-28 08:20:38 +0300 149) │ Sign + Exponent │ Significand │
07a2b481 (kx 2024-12-28 08:20:38 +0300 150) └────── . . . ───────┴─────────────── . . . ──────────────────┘
07a2b481 (kx 2024-12-28 08:20:38 +0300 151) ^Sign bit ^(1. - implicit)
07a2b481 (kx 2024-12-28 08:20:38 +0300 152) size: nE nS.
07a2b481 (kx 2024-12-28 08:20:38 +0300 153) }
07a2b481 (kx 2024-12-28 08:20:38 +0300 154)
07a2b481 (kx 2024-12-28 08:20:38 +0300 155) if( MPU_BYTE_ORDER_BIG_ENDIAN == 1 )
07a2b481 (kx 2024-12-28 08:20:38 +0300 156) {
07a2b481 (kx 2024-12-28 08:20:38 +0300 157) [0], . . . , [nE-1] │ [nE], . . . , [NB-1];
07a2b481 (kx 2024-12-28 08:20:38 +0300 158) ┌────── . . . ───────┬─────────────── . . . ──────────────────┐
07a2b481 (kx 2024-12-28 08:20:38 +0300 159) │ Sign + Exponent │ Significand │
07a2b481 (kx 2024-12-28 08:20:38 +0300 160) └────── . . . ───────┴─────────────── . . . ──────────────────┘
07a2b481 (kx 2024-12-28 08:20:38 +0300 161) ^Sign bit ^(1. - implicit)
07a2b481 (kx 2024-12-28 08:20:38 +0300 162) size: nE nS.
07a2b481 (kx 2024-12-28 08:20:38 +0300 163) }
07a2b481 (kx 2024-12-28 08:20:38 +0300 164) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 165) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 166) Здесь, символы \fBnE\fP и \fBnS\fP — обозначают количество байтов экспоненты и количество
07a2b481 (kx 2024-12-28 08:20:38 +0300 167) байтов мантиссы, соответственно.
07a2b481 (kx 2024-12-28 08:20:38 +0300 168) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 169) Количество бит выделяемое для представления знака, экспоненты и мантиссы распределено
07a2b481 (kx 2024-12-28 08:20:38 +0300 170) следующим образом:
07a2b481 (kx 2024-12-28 08:20:38 +0300 171) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 172) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 173) ┌───────────────────────┬───────────────────┬─────────────┐
07a2b481 (kx 2024-12-28 08:20:38 +0300 174) │ Общее количество бит │ (Sign + Exponent) │ Significand │
07a2b481 (kx 2024-12-28 08:20:38 +0300 175) ├───────────────────────┼───────────────────┼─────────────┤
07a2b481 (kx 2024-12-28 08:20:38 +0300 176) │ 32 │ 1 + 8 + │ 23 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 177) │ 64 │ 1 + 11 + │ 52 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 178) │ 128 │ 1 + 31 + │ 96 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 179) │ 256 │ 1 + 31 + │ 224 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 180) │ 512 │ 1 + 63 + │ 448 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 181) │ 1024 │ 1 + 63 + │ 960 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 182) │ 2048 │ 1 + 127 + │ 1920 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 183) │ 4096 │ 1 + 127 + │ 3968 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 184) │ 8192 │ 1 + 255 + │ 7936 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 185) │ 16384 │ 1 + 255 + │ 16128 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 186) │ 32768 │ 1 + 511 + │ 32256 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 187) │ 65536 │ 1 + 511 + │ 65024 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 188) └───────────────────────┴───────────────────┴─────────────┘
07a2b481 (kx 2024-12-28 08:20:38 +0300 189) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 190) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 191) Форматы 32\- и 64\-битных чисел полностью совпадают с \fBIEEE\fP (Institute of Electrical
07a2b481 (kx 2024-12-28 08:20:38 +0300 192) and Electronics Engineers) форматом.
07a2b481 (kx 2024-12-28 08:20:38 +0300 193) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 194) Для удобства декларирования переменных вещественного типа в заголовочном файле
07a2b481 (kx 2024-12-28 08:20:38 +0300 195) \fBlibmpu.h\fP определены соответствующие типы данных, применение которых может
07a2b481 (kx 2024-12-28 08:20:38 +0300 196) выглядеть, например, следующим образом:
07a2b481 (kx 2024-12-28 08:20:38 +0300 197) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 198) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 199) mpu_real16384_t a, b;
07a2b481 (kx 2024-12-28 08:20:38 +0300 200) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 201) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 202) .SS Не числа
07a2b481 (kx 2024-12-28 08:20:38 +0300 203) Для расширения вычислительных возможностей в формате чисел с плавающей точкой наряду
07a2b481 (kx 2024-12-28 08:20:38 +0300 204) с обычными вещественными числами предусмотрено несколько специальных значений. Они
07a2b481 (kx 2024-12-28 08:20:38 +0300 205) имеют определенный смысл и дают важную информацию об алгоритмах и операциях, в которых
07a2b481 (kx 2024-12-28 08:20:38 +0300 206) появляются эти значения. К специальным значениям относятся вещественные числа
07a2b481 (kx 2024-12-28 08:20:38 +0300 207) с нарушением нормализации, неопределенность, нули, бесконечности и не числа,
07a2b481 (kx 2024-12-28 08:20:38 +0300 208) представленные в следующей таблице.
07a2b481 (kx 2024-12-28 08:20:38 +0300 209) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 210) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 211) ┌──────┬───────────────────┬───────────────────┬──────────────────┐
07a2b481 (kx 2024-12-28 08:20:38 +0300 212) │ Sign │ Exponent │ Significand │ comments │
07a2b481 (kx 2024-12-28 08:20:38 +0300 213) ├──────┼───────────────────┼───────────────────┼──────────────────┤
07a2b481 (kx 2024-12-28 08:20:38 +0300 214) │ S │ 1111 . . . 1111 │ 0000 . . . 0000 │ +/- inf │
07a2b481 (kx 2024-12-28 08:20:38 +0300 215) │ S │ 0000 . . . 0000 │ 0000 . . . 0000 │ +/- 0 │
07a2b481 (kx 2024-12-28 08:20:38 +0300 216) │ 1 │ 1111 . . . 1111 │ 1000 . . . 0000 │ - ind │
07a2b481 (kx 2024-12-28 08:20:38 +0300 217) │ S │ 1111 . . . 1111 │ 0000 . . . 0001 │ +/- NaN (min) │
07a2b481 (kx 2024-12-28 08:20:38 +0300 218) │ S │ 1111 . . . 1111 │ 1111 . . . 1111 │ +/- NaN (max) │
07a2b481 (kx 2024-12-28 08:20:38 +0300 219) └──────┴───────────────────┴───────────────────┴──────────────────┘
07a2b481 (kx 2024-12-28 08:20:38 +0300 220)
07a2b481 (kx 2024-12-28 08:20:38 +0300 221) Здесь:
07a2b481 (kx 2024-12-28 08:20:38 +0300 222) +/- inf - +/- бесконечность;
07a2b481 (kx 2024-12-28 08:20:38 +0300 223) +/- 0 - +/- знаковый нуль;
07a2b481 (kx 2024-12-28 08:20:38 +0300 224) - ind - неопределенность;
07a2b481 (kx 2024-12-28 08:20:38 +0300 225) +/- NaN (min) - +/- минимальное не число;
07a2b481 (kx 2024-12-28 08:20:38 +0300 226) +/- NaN (max) - +/- максимальное не число.
07a2b481 (kx 2024-12-28 08:20:38 +0300 227) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 228) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 229) Числа с нарушением нормализации:
07a2b481 (kx 2024-12-28 08:20:38 +0300 230) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 231) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 232) ┌──────┬───────────────────┬───────────────────┬──────────────────┐
07a2b481 (kx 2024-12-28 08:20:38 +0300 233) │ Sign │ Exponent │ Significand │ comments │
07a2b481 (kx 2024-12-28 08:20:38 +0300 234) ├──────┼───────────────────┼───────────────────┼──────────────────┤
07a2b481 (kx 2024-12-28 08:20:38 +0300 235) │ S │ 0000 . . . 0000 │ 0000 . . . 0001 │ +/- min │
07a2b481 (kx 2024-12-28 08:20:38 +0300 236) │ S │ 0000 . . . 0000 │ 1111 . . . 1111 │ +/- max │
07a2b481 (kx 2024-12-28 08:20:38 +0300 237) └──────┴───────────────────┴───────────────────┴──────────────────┘
07a2b481 (kx 2024-12-28 08:20:38 +0300 238) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 239) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 240) Кодировка максимального и минимального вещественных чисел:
07a2b481 (kx 2024-12-28 08:20:38 +0300 241) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 242) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 243) ┌──────┬───────────────────┬───────────────────┬──────────────────┐
07a2b481 (kx 2024-12-28 08:20:38 +0300 244) │ Sign │ Exponent │ Significand │ comments │
07a2b481 (kx 2024-12-28 08:20:38 +0300 245) ├──────┼───────────────────┼───────────────────┼──────────────────┤
07a2b481 (kx 2024-12-28 08:20:38 +0300 246) │ S │ 0000 . . . 0001 │ 0000 . . . 0000 │ +/- MIN │
07a2b481 (kx 2024-12-28 08:20:38 +0300 247) │ S │ 1111 . . . 1110 │ 1111 . . . 1111 │ +/- MAX │
07a2b481 (kx 2024-12-28 08:20:38 +0300 248) └──────┴───────────────────┴───────────────────┴──────────────────┘
07a2b481 (kx 2024-12-28 08:20:38 +0300 249) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 250) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 251) .SS Комплексные числа
07a2b481 (kx 2024-12-28 08:20:38 +0300 252) Комплексные числа хранятся в памяти машины как структура, состоящая из двух
07a2b481 (kx 2024-12-28 08:20:38 +0300 253) вещественных чисел.
07a2b481 (kx 2024-12-28 08:20:38 +0300 254) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 255) Константы, определяющие размер комплексных чисел в байтах, заданы так, что
07a2b481 (kx 2024-12-28 08:20:38 +0300 256) они представляют половину размера комплексного числа:
07a2b481 (kx 2024-12-28 08:20:38 +0300 257) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 258) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 259) #define NB_C32 4
07a2b481 (kx 2024-12-28 08:20:38 +0300 260) #define NB_C64 8
07a2b481 (kx 2024-12-28 08:20:38 +0300 261) #define NB_C128 16
07a2b481 (kx 2024-12-28 08:20:38 +0300 262) #define NB_C256 32
07a2b481 (kx 2024-12-28 08:20:38 +0300 263) #define NB_C512 64
07a2b481 (kx 2024-12-28 08:20:38 +0300 264) #define NB_C1024 128
07a2b481 (kx 2024-12-28 08:20:38 +0300 265) #define NB_C2048 256
07a2b481 (kx 2024-12-28 08:20:38 +0300 266) #define NB_C4096 512
07a2b481 (kx 2024-12-28 08:20:38 +0300 267) #define NB_C8192 1024
07a2b481 (kx 2024-12-28 08:20:38 +0300 268) #define NB_C16384 2048
07a2b481 (kx 2024-12-28 08:20:38 +0300 269) #define NB_C32768 4096
07a2b481 (kx 2024-12-28 08:20:38 +0300 270) #define NB_C65536 8192
07a2b481 (kx 2024-12-28 08:20:38 +0300 271) #define NB_C_MAX 8192
07a2b481 (kx 2024-12-28 08:20:38 +0300 272) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 273) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 274) Здесь важно отметить, что функции, работающие с комплексными переменными в качестве параметра,
653f53cb (kx 2024-12-30 21:50:33 +0300 275) определяющего размер операндов принимают именно эти величины. Например для работы
07a2b481 (kx 2024-12-28 08:20:38 +0300 276) с переменной типа \fBmpu_complex256_t\fP, на вход функций надо подавать \fBnb\fP = 32 ==
07a2b481 (kx 2024-12-28 08:20:38 +0300 277) \fBNB_C256\fP, в то время, как \fBsizeof\fP(\fBmpu_complex256_t\fP) == 64 == \fBNB_C256\fP * 2.
07a2b481 (kx 2024-12-28 08:20:38 +0300 278) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 279) Представление комплексных чисел в памяти показано на следующей схеме:
07a2b481 (kx 2024-12-28 08:20:38 +0300 280) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 281) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 282) if( MPU_BYTE_ORDER_BIG_ENDIAN == 0 )
07a2b481 (kx 2024-12-28 08:20:38 +0300 283) {
07a2b481 (kx 2024-12-28 08:20:38 +0300 284) [NB*2-1], . . . , [NB] │ [NB-1], . . . , [0];
07a2b481 (kx 2024-12-28 08:20:38 +0300 285) ┌──────────── . . . ───────────┬──────────── . . . ───────────┐
07a2b481 (kx 2024-12-28 08:20:38 +0300 286) │ Real part │ Imaginary │
07a2b481 (kx 2024-12-28 08:20:38 +0300 287) └──────────── . . . ───────────┴──────────── . . . ───────────┘
07a2b481 (kx 2024-12-28 08:20:38 +0300 288) size: NB_Real == NB_CXXX NB_Imag == NB_CXXX.
07a2b481 (kx 2024-12-28 08:20:38 +0300 289) }
07a2b481 (kx 2024-12-28 08:20:38 +0300 290)
07a2b481 (kx 2024-12-28 08:20:38 +0300 291) if( MPU_BYTE_ORDER_BIG_ENDIAN == 1 )
07a2b481 (kx 2024-12-28 08:20:38 +0300 292) {
07a2b481 (kx 2024-12-28 08:20:38 +0300 293) [0], . . . , [NB-1] │ [NB], . . . , [NB*2-1];
07a2b481 (kx 2024-12-28 08:20:38 +0300 294) ┌──────────── . . . ───────────┬──────────── . . . ───────────┐
07a2b481 (kx 2024-12-28 08:20:38 +0300 295) │ Real part │ Imaginary │
07a2b481 (kx 2024-12-28 08:20:38 +0300 296) └──────────── . . . ───────────┴──────────── . . . ───────────┘
07a2b481 (kx 2024-12-28 08:20:38 +0300 297) size: NB_Real == NB_CXXX NB_Imag == NB_CXXX.
07a2b481 (kx 2024-12-28 08:20:38 +0300 298) }
07a2b481 (kx 2024-12-28 08:20:38 +0300 299) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 300) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 301) Форматы вещественной и мнимой частей комплексных переменных совпадают с форматами вещественных чисел.
07a2b481 (kx 2024-12-28 08:20:38 +0300 302) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 303) .SH Флаги
07a2b481 (kx 2024-12-28 08:20:38 +0300 304) Большинство операций с целыми и вещественными числами выставляют флаги. Флаги операций
07a2b481 (kx 2024-12-28 08:20:38 +0300 305) размещены в целой 32\-битной переменной. Младшие 8 битов [7 ... 0] отданы под флаги
07a2b481 (kx 2024-12-28 08:20:38 +0300 306) целочисленных операций. Биты с 8\-го по 15\-й занимают флаги, выставляемые операциями
07a2b481 (kx 2024-12-28 08:20:38 +0300 307) с вещественными числами.
07a2b481 (kx 2024-12-28 08:20:38 +0300 308) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 309) .SS Флаги целочисленных операций:
07a2b481 (kx 2024-12-28 08:20:38 +0300 310) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 311) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 312) 7 6 5 4 3 2 1 0
07a2b481 (kx 2024-12-28 08:20:38 +0300 313) . . . ─┬────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
07a2b481 (kx 2024-12-28 08:20:38 +0300 314) │ V │ R │ Z │ P │ S │ O │ C │ A │
07a2b481 (kx 2024-12-28 08:20:38 +0300 315) . . . ─┴────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
07a2b481 (kx 2024-12-28 08:20:38 +0300 316) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 317) A - Auxiliary Carry Flag (carry from lowest 4-bit word)
07a2b481 (kx 2024-12-28 08:20:38 +0300 318) C - Carry Flag
07a2b481 (kx 2024-12-28 08:20:38 +0300 319) O - Overflow Flag
07a2b481 (kx 2024-12-28 08:20:38 +0300 320) S - Sign Flag
07a2b481 (kx 2024-12-28 08:20:38 +0300 321) P - Parity Flag (of lowest significant byte)
07a2b481 (kx 2024-12-28 08:20:38 +0300 322) Z - Zero Flag
07a2b481 (kx 2024-12-28 08:20:38 +0300 323) R - major || remainder
07a2b481 (kx 2024-12-28 08:20:38 +0300 324) V - Invalid operation
07a2b481 (kx 2024-12-28 08:20:38 +0300 325) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 326) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 327) NOTE: Флаги \fBA\fP и \fBP\fP выставляются только операциями над 8\-разрядными
07a2b481 (kx 2024-12-28 08:20:38 +0300 328) и 16\-разрядными переменными.
07a2b481 (kx 2024-12-28 08:20:38 +0300 329) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 330) .SS Флаги операций с вещественными переменными:
07a2b481 (kx 2024-12-28 08:20:38 +0300 331) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 332) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 333) 15 14 13 12 11 10 9 8
07a2b481 (kx 2024-12-28 08:20:38 +0300 334) . . . ─┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬ . . .
07a2b481 (kx 2024-12-28 08:20:38 +0300 335) │ INX │ IND │ PLS │ TLS │ UDF │ OVF │ SNG │ DOM │
07a2b481 (kx 2024-12-28 08:20:38 +0300 336) . . . ─┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴ . . .
07a2b481 (kx 2024-12-28 08:20:38 +0300 337) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 338) DOM - Domain Flag
07a2b481 (kx 2024-12-28 08:20:38 +0300 339) SNG - Singularity Flag
07a2b481 (kx 2024-12-28 08:20:38 +0300 340) OVF - Overflow Flag
07a2b481 (kx 2024-12-28 08:20:38 +0300 341) UDF - Underflow Flag
07a2b481 (kx 2024-12-28 08:20:38 +0300 342) TLS - TLOSS Flag
07a2b481 (kx 2024-12-28 08:20:38 +0300 343) PLS - PLOSS Flag
07a2b481 (kx 2024-12-28 08:20:38 +0300 344) IND - ind-produsing operation Flag
07a2b481 (kx 2024-12-28 08:20:38 +0300 345) INX - Inexact Flag
07a2b481 (kx 2024-12-28 08:20:38 +0300 346) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 347) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 348) В заголовочном файле \fBlibmpu.h\fP определены функции работы с флагами, такие как
07a2b481 (kx 2024-12-28 08:20:38 +0300 349) очистка флагов, сброс, выставление флагов, а также проверки флагов операций.
07a2b481 (kx 2024-12-28 08:20:38 +0300 350) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 351) .SH Исключения и коды ошибок
07a2b481 (kx 2024-12-28 08:20:38 +0300 352) Помимо выставления флагов операциями с целыми и вещественными числами, библиотека \fBLibMPU\fP
07a2b481 (kx 2024-12-28 08:20:38 +0300 353) поддерживает стандартную переменную \fBerrno\fP и, ктоме того, собственные переменные
07a2b481 (kx 2024-12-28 08:20:38 +0300 354) \fB__mpu_integer_error_no\fP, \fB__mpu_real_error_no\fP, \fB__mpu_complex_error_no\fP,
07a2b481 (kx 2024-12-28 08:20:38 +0300 355) \fB__mpu_math_error_no\fP.
07a2b481 (kx 2024-12-28 08:20:38 +0300 356) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 357) Коды ошибок определены в заголовочном файле \fBlibmpu.h\fP.
07a2b481 (kx 2024-12-28 08:20:38 +0300 358) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 359) Библиотека \fBLibMPU\fP поддерживает обработку ошибок посредством функции
07a2b481 (kx 2024-12-28 08:20:38 +0300 360) \fB__mpu_math_error()\fP, которая может быть переопределена пользователем
07a2b481 (kx 2024-12-28 08:20:38 +0300 361) на этапе компоновки объектного кода так, как это возможно при переопределении
07a2b481 (kx 2024-12-28 08:20:38 +0300 362) функции \fBmatherr()\fP во время компоновки программ со стандартной библиотекой языка \fBC\fP
07a2b481 (kx 2024-12-28 08:20:38 +0300 363) (например, \fBGNU Libc\fP).
07a2b481 (kx 2024-12-28 08:20:38 +0300 364) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 365) Кроме того, пользователь может переопределить функцию \fB__mpu_warning()\fP,
653f53cb (kx 2024-12-30 21:50:33 +0300 366) которая выводит дополнительную информацию об ошибках.
07a2b481 (kx 2024-12-28 08:20:38 +0300 367) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 368) Как и в случае функции \fBmatherr()\fP стандартной библиотеки языка \fBC\fP,
07a2b481 (kx 2024-12-28 08:20:38 +0300 369) параметром функций \fB__mpu_math_error()\fP, \fB__mpu_warning()\fP является
07a2b481 (kx 2024-12-28 08:20:38 +0300 370) указатель на структуру \fB__exception\fP:
07a2b481 (kx 2024-12-28 08:20:38 +0300 371) .nf
07a2b481 (kx 2024-12-28 08:20:38 +0300 372) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 373) struct __exception
07a2b481 (kx 2024-12-28 08:20:38 +0300 374) {
07a2b481 (kx 2024-12-28 08:20:38 +0300 375) int who; /* _COMPLEX_, _REAL_, _INTEGER_, _MATH_ */
07a2b481 (kx 2024-12-28 08:20:38 +0300 376)
07a2b481 (kx 2024-12-28 08:20:38 +0300 377) int type;
07a2b481 (kx 2024-12-28 08:20:38 +0300 378) __mpu_char8_t *name;
07a2b481 (kx 2024-12-28 08:20:38 +0300 379) __mpu_char8_t *msg;
07a2b481 (kx 2024-12-28 08:20:38 +0300 380) int msg_type; /* >= 1 - error, 0 - warning */
07a2b481 (kx 2024-12-28 08:20:38 +0300 381)
07a2b481 (kx 2024-12-28 08:20:38 +0300 382) int nb_a1; /* number of bytes in arg_1 */
07a2b481 (kx 2024-12-28 08:20:38 +0300 383) int nb_a2; /* number of bytes in arg_2 */
07a2b481 (kx 2024-12-28 08:20:38 +0300 384) int nb_rv; /* number of bytes in return_value */
07a2b481 (kx 2024-12-28 08:20:38 +0300 385)
07a2b481 (kx 2024-12-28 08:20:38 +0300 386) unsigned char *arg_1;
07a2b481 (kx 2024-12-28 08:20:38 +0300 387) unsigned char *arg_2;
07a2b481 (kx 2024-12-28 08:20:38 +0300 388) unsigned char *return_value;
07a2b481 (kx 2024-12-28 08:20:38 +0300 389) };
07a2b481 (kx 2024-12-28 08:20:38 +0300 390) .fi
07a2b481 (kx 2024-12-28 08:20:38 +0300 391) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 392) в которой определены: источник ошибки, тип ошибки, имя функции выполнение которой
07a2b481 (kx 2024-12-28 08:20:38 +0300 393) привело к ошибке, а также указатели на аргументы функции и полученное возвращаемое
07a2b481 (kx 2024-12-28 08:20:38 +0300 394) значение.
07a2b481 (kx 2024-12-28 08:20:38 +0300 395) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 396) С помощью функции \fB__mpu_utf8mpu_error()\fP можно получить указатель на строковую
07a2b481 (kx 2024-12-28 08:20:38 +0300 397) константу, содержащую текстовое описание ошибки, соответствующее коду ошибки (см.
07a2b481 (kx 2024-12-28 08:20:38 +0300 398) переменные \fB__mpu_integer_error_no\fP, \fB__mpu_real_error_no\fP,
07a2b481 (kx 2024-12-28 08:20:38 +0300 399) \fB__mpu_complex_error_no\fP, \fB__mpu_math_error_no\fP).
07a2b481 (kx 2024-12-28 08:20:38 +0300 400) .PP
07a2b481 (kx 2024-12-28 08:20:38 +0300 401) Для простых вычислений, как правило, не приходится переопределять функции
07a2b481 (kx 2024-12-28 08:20:38 +0300 402) \fBmatherr()\fP, \fB__mpu_math_error()\fP и \fB__mpu_warning()\fP, однако
07a2b481 (kx 2024-12-28 08:20:38 +0300 403) мы сохранили такую возможность как одну из стандартных возможностей,
07a2b481 (kx 2024-12-28 08:20:38 +0300 404) предоставляемых библиотекой языка \fBC\fP.
07a2b481 (kx 2024-12-28 08:20:38 +0300 405) .sp
07a2b481 (kx 2024-12-28 08:20:38 +0300 406) .SH SEE ALSO
41c271da (kx 2025-01-05 15:42:39 +0300 407) .BR iadd(3),
41c271da (kx 2025-01-05 15:42:39 +0300 408) .BR isub(3),
41c271da (kx 2025-01-05 15:42:39 +0300 409) .BR iadc(3),
41c271da (kx 2025-01-05 15:42:39 +0300 410) .BR isbb(3),
41c271da (kx 2025-01-05 15:42:39 +0300 411) .BR ishl(3),
41c271da (kx 2025-01-05 15:42:39 +0300 412) .BR ishr(3),
41c271da (kx 2025-01-05 15:42:39 +0300 413) .BR isal(3),
41c271da (kx 2025-01-05 15:42:39 +0300 414) .BR isar(3),
41c271da (kx 2025-01-05 15:42:39 +0300 415) .BR irol(3),
41c271da (kx 2025-01-05 15:42:39 +0300 416) .BR iror(3),
41c271da (kx 2025-01-05 15:42:39 +0300 417) .BR ircl(3),
41c271da (kx 2025-01-05 15:42:39 +0300 418) .BR ircr(3),
41c271da (kx 2025-01-05 15:42:39 +0300 419) .BR ishln(3),
41c271da (kx 2025-01-05 15:42:39 +0300 420) .BR ishrn(3),
41c271da (kx 2025-01-05 15:42:39 +0300 421) .BR isaln(3),
41c271da (kx 2025-01-05 15:42:39 +0300 422) .BR isarn(3),
41c271da (kx 2025-01-05 15:42:39 +0300 423) .BR iroln(3),
41c271da (kx 2025-01-05 15:42:39 +0300 424) .BR irorn(3),
41c271da (kx 2025-01-05 15:42:39 +0300 425) .BR ircln(3),
41c271da (kx 2025-01-05 15:42:39 +0300 426) .BR ircrn(3),
41c271da (kx 2025-01-05 15:42:39 +0300 427) .BR ineg(3),
41c271da (kx 2025-01-05 15:42:39 +0300 428) .BR inot(3),
41c271da (kx 2025-01-05 15:42:39 +0300 429) .BR iand(3),
41c271da (kx 2025-01-05 15:42:39 +0300 430) .BR itest(3),
41c271da (kx 2025-01-05 15:42:39 +0300 431) .BR icmp(3),
41c271da (kx 2025-01-05 15:42:39 +0300 432) .BR ior(3),
41c271da (kx 2025-01-05 15:42:39 +0300 433) .BR ixor(3),
41c271da (kx 2025-01-05 15:42:39 +0300 434) .BR iinc(3),
41c271da (kx 2025-01-05 15:42:39 +0300 435) .BR idec(3),
41c271da (kx 2025-01-05 15:42:39 +0300 436) .BR ixchg(3),
41c271da (kx 2025-01-05 15:42:39 +0300 437) .BR icpy(3),
41c271da (kx 2025-01-05 15:42:39 +0300 438) .BR icvt(3),
41c271da (kx 2025-01-05 15:42:39 +0300 439) .BR imul(3),
41c271da (kx 2025-01-05 15:42:39 +0300 440) .BR ismul(3),
41c271da (kx 2025-01-05 15:42:39 +0300 441) .BR idiv(3),
41c271da (kx 2025-01-05 15:42:39 +0300 442) .BR isdiv(3),
41c271da (kx 2025-01-05 15:42:39 +0300 443) .BR iatoi(3),
41c271da (kx 2025-01-05 15:42:39 +0300 444) .BR iatoui(3),
41c271da (kx 2025-01-05 15:42:39 +0300 445) .BR iitoa(3),
41c271da (kx 2025-01-05 15:42:39 +0300 446) .BR iuitoa(3).