1. Действительные числа как рациональные дроби.
2. Представление с фиксированной точкой.
3. Фиксированная точка и двоично-десятичный код.
4. Числа с плавающей точкой. Binary32, binary64, битовое устройство числа, варианты хранимых чисел.
5. Пример кодирования числа.
6. Возможные проблемы плавающей арифметики.
7. Пример проблем: сравнение двух "равных" чисел.
8. Пример проблем: вычисление числа π по двум формулам.
9. Иерархия структур и типов данных.
5. ФИКСИРОВАННАЯ ТОЧКА.
ОСОБЕННОСТИ
• Больше точность – меньше диапазон.
Больше диапазон – меньше точность.
• Округление при представлении чисел (отбрасывание дробной части).
• Умножение и деление могут привести к потере точности.
• Вычисления так же быстры, как вычисления с целыми числами.
• Sony Playstation, Nintendo Gameboy.
• Кодирование звука: GSM Full rate, Ogg Vorbis.
6. FIXED-POINT BCD
• $1 = 30,7576 руб. (курс ЦБ РФ с 12.03.2013).
• 30,7576 → 307576 → 30757616 → 76 75 30 00 (в памяти,
little endian).
• Метод часто используется для хранения денежных
величин (COBOL).
7. ПРЕДСТАВЛЕНИЕ С
ПЛАВАЮЩЕЙ ТОЧКОЙ
•x = m⋅be. • 3,1415
= 0,31415⋅101.
400 = 4⋅102 = 0,4⋅103.
•m – мантисса (значащая
часть, significand). • Нормализация: |m|<1.
•b – основание степени
(обычно 2 или 10).
•e – экспонента
(порядок).
8. СТАНДАРТ IEEE 754
binary32
± (S) Экспонента (E) Мантисса (M)
1 8 бит 23 бита
binary64
S E M
1 11 бит 52 бита
9. ВИДЫ ХРАНИМЫХ ЧИСЕЛ
Тип Экспонента Мантисса
±0 0 0
Денормализованные числа 0 0.mmmmmmm
Нормализованные числа 1…254 (1…2046) 1.mmmmmmm
±∞ 255 (2047) 0
Не-числа (NaN) 255 (2047) любая
10. НОРМАЛИЗОВАННЫЕ
ЧИСЛА
• Для binary32:
•F = (−1)S⋅2E−127⋅1.mm…m.
•1 ≤ M < 2.
• |F|min = 21−127⋅1.00…0 = 2−126 ≈1,18⋅10−38.
• |F|max = 2254−127⋅1.11…1 = 2127⋅(2−2−23) ≈3,4⋅1038.
18. ПРОБЛЕМА СРАВНЕНИЯ
float x = 0.1f; // 0.100000001490
float y1 = x*x;
// 0.010000000708 = 0 01111000 01000111101011100001011
float y2 = 0.01f;
// 0.009999999776 = 0 01111000 01000111101011100001010
y1 == y2; // => 0
один бит
отличается
19. ПРОБЛЕМА СРАВНЕНИЯ
// float.h
/* Difference between 1.0 and
the minimum float greater than 1.0 */
#define FLT_EPSILON 1.1920929e-07F
/* Difference between 1.0 and
the minimum double greater than 1.0 */
#define DBL_EPSILON 2.2204460492503131e-16
20. ПРОБЛЕМА СРАВНЕНИЯ
#include <float.h>
#include <math.h>
int almostEqual(float a, float b) {
float A = fabs(a);
float B = fabs(b);
float largest = (B > A) ? B : A;
return (fabs(A - B)/largest <= FLT_EPSILON);
}
almostEqual(y1, y2); // => 1
21. ВЫЧИСЛЕНИЕ π
π≈ 6⋅2 i
i⋅t при i→∞.
или
i 1-я формула 2-я формула
0 3.4641016151377543863 3.4641016151377543863
10 3.1415929278733740748 3.1415929273850979885
16 3.1415926717412858693 3.1415926536566394222
17 3.1415810075796233302 3.1415926536065061913
20 3.1405434924008406305 3.1415926535900560168
24 3.2245152435345525443 3.1415926535897968907
22. ПРИМИТИВНЫЕ ТИПЫ
ДАННЫХ
• Числа (целые, дробные).
• Символы (строки?).
• Булевы переменные (True / False, Истина / Ложь).
23. Данные предметной области
Списки
Сложные типы данных Деревья
Хеш-таблицы
Массивы
Составные типы данных Записи
(структуры)
Примитивные типы данных
Числа, символы, перечисления
ПИРАМИДА ДАННЫХ