Проблема не в написании самого программного кода, а в алгоритме представления вещественного числа в памяти компьютера. Дело в том, что в интернете в разных местах написано по разному. Чтобы было понятно, я написал пару вариантов ниже, которые нашел.
Допустим нужно представить вещественное число в двоичной системе в памяти компьютера, при условии, что число занимает 4 байта. 4 байта = 32 бита.
Вариант 1
первый байт старший, остальные три младшие
первый бит старшего байта хранит знак числа
второй бит старшего байта хранит знак порядка
оставшиеся биты старшего байта хранят двоичный код порядка
в младших байтах хранится двоичный код мантиссы. При чем число мантиссы представлено следующим образом - 0,хххх, где ноль целых считается как старшим разрядом и он не хранится в памяти, как и сама запятая. т. е. в мантиссе хранится только дробная часть числа.
Вариант 2
первый бит в первом байте хранит знак числа
в следующих 8 битах (именно 8 при одинарной точности; 11 при двойной, 15 при 4-ой точности) хранится код сдвинутого порядка. Почему сдвинутого? Ну чтоб не хранить знак порядка.
в остальных битах хранится значение мантиссы, при чем значение мантиссы зависит от того НОРМАЛИЗОВАННОЕ число или ДЕНОРМАЛИЗОВАННОЕ.
НОРМАЛИЗОВАННОЕ ЧИСЛО это когда все биты порядка НЕ СОСТОЯТ ИЗ ОДНИХ НУЛЕЙ, тогда мантисса хранится в виде 1,ххх, где 1 и «,» в памяти не хранятся.
ДЕНОРМАЛИЗОВАННОЕ ЧИСЛО это когда все биты порядка СОСТОЯТ ИЗ ОДНИХ НУЛЕЙ, ТОГДА МАНТИССА хранится в виде 0,ххх, где 0 и «,» не хранятся в памяти.
Вариант 3
Первый байт старший, остальные три младшие
Первый бит старшего байта хранит знак порядка
Остальные биты старшего байта хранят значение порядка
Первый бит второго байта хранит знак мантиссы
Остальные биты младших байтов хранят значение мантиссы. При чем мантисса хранится в виде ххх. Т. е. нет нуля или единицы в целой части. По сути мантисса записывается в виде обычного целого числа. (к примеру число 3,45 переводим как 0,345*10^(-1). В мантиссу записывается двоичный код числа 345= 00000000000000101011001.
Другие языки программирования и технологии
Как написать программу, которая будет представлять вещественное число в памяти компьютера
для начала определимся с порядком байтов. на разных системах он свой.
в little-endian системах (например в привычной x86) младший байт идет первым
биты в байтах нумеруются так
7 6 5 4 3 2 1 0__15 14 13 12 11 10 9 8__23 22 21 20 19 18 17 16__31 30 29 28 27 26 25 24
в big-endian (их мало осталось, но есть гибридные) младший байт идет последним
31 30 29 28 27 26 25 24__23 22 21 20 19 18 17 16__15 14 13 12 11 10 9 8__7 6 5 4 3 2 1 0
вас скорее всего интересует первый вариант но во избежание путаницы лучше записать биты в порядке убывания (как в big-endinan), а потом переставить _байты_ в обратном порядке.
возьмем число 0.1875
переведем в двоичную систему
0.0011
старший бит (31) числа это знак - число положительное, значит 0
0...
8 следующих битов с 30 по 23 - порядок. т. е. смещение запятой относительно старшей единицы числа
в нашем случае запятая на 3 позиции левее старшей единицы, значит порядок -3
при кодировании к нему прибавляется 127 (так чтобы минимально возможный порядок -127 кодировался как 0)
получается -3 + 127 = 124 = 01111100 в двоичной
00111110__0...
далее записывается мантисса, то, что после запятой
0011
пропускаем нули
11
пропускаем первую единицу для нормализованного числа
1
дополняем нулями до конца, и записываем результат
00111110__01000000__00000000__00000000
опять же. это у нас результат в поредке убывания битов
вот теперь надо обратить порядок байтов для записи в память little-endian системы
00000000__00000000__01000000__00111110
проверяем
>>> import struct
>>> struct.unpack("<f", bytes([0b00000000, 0b00000000, 0b01000000, 0b00111110]))
(0.1875,)
вопросы в комментарии, в т. ч по денормализованным. а то и так каша получилась
в little-endian системах (например в привычной x86) младший байт идет первым
биты в байтах нумеруются так
7 6 5 4 3 2 1 0__15 14 13 12 11 10 9 8__23 22 21 20 19 18 17 16__31 30 29 28 27 26 25 24
в big-endian (их мало осталось, но есть гибридные) младший байт идет последним
31 30 29 28 27 26 25 24__23 22 21 20 19 18 17 16__15 14 13 12 11 10 9 8__7 6 5 4 3 2 1 0
вас скорее всего интересует первый вариант но во избежание путаницы лучше записать биты в порядке убывания (как в big-endinan), а потом переставить _байты_ в обратном порядке.
возьмем число 0.1875
переведем в двоичную систему
0.0011
старший бит (31) числа это знак - число положительное, значит 0
0...
8 следующих битов с 30 по 23 - порядок. т. е. смещение запятой относительно старшей единицы числа
в нашем случае запятая на 3 позиции левее старшей единицы, значит порядок -3
при кодировании к нему прибавляется 127 (так чтобы минимально возможный порядок -127 кодировался как 0)
получается -3 + 127 = 124 = 01111100 в двоичной
00111110__0...
далее записывается мантисса, то, что после запятой
0011
пропускаем нули
11
пропускаем первую единицу для нормализованного числа
1
дополняем нулями до конца, и записываем результат
00111110__01000000__00000000__00000000
опять же. это у нас результат в поредке убывания битов
вот теперь надо обратить порядок байтов для записи в память little-endian системы
00000000__00000000__01000000__00111110
проверяем
>>> import struct
>>> struct.unpack("<f", bytes([0b00000000, 0b00000000, 0b01000000, 0b00111110]))
(0.1875,)
вопросы в комментарии, в т. ч по денормализованным. а то и так каша получилась
Андрей Черненко
а почему не на стандарт ieee 754?
Похожие вопросы
- 1. Написать программу, которая заполняет массив целых чисел размеров 20 элементов значениями роста учащихся (случайные ч
- Написать программу, которая формирует два массива чисел
- Напишите программу, которая находит максимальное среди чисел, записанных в файле, и выводит результат в другой файл.
- аскаль. Написать программу которая переводит число из одной системы счисления в другую
- Требуется написать программу, которая из цифр двух натуральных чисел создает наименьшее возможное число, сохраняя при эт
- Помогите! Информатика. Вводится пять чисел. Написать программу, которая вычисляет сумму всех четных из них.
- Необходимо написать программу которая открывает файл "input.txt" и удаляет в ней все пробелы и числа. с++
- Программа, которая находит разность двух чисел (IEEE 754 стандарт double) ассемблер.
- Напишите программу, которая выводит запись переданного ей числа в римской системе счисления. Используйте процедуру. С++
- Напишите программу, которая выводит на экран все делители числа N, (число N вводится с клавиатуры) абсПАСКАЛЬ ПОМОГИТЕ
в общем берем все начиная с первой значащей единицы (и ее пропускаем)
если единицы нет ни одной - т. е. число 0 - это особый случай. записывается всеми нулевыми битами (так если бы это было минимально возможное денормализованное число, хотя 0 формально не является денормализованным, просто особый случай)