Представление чисел в двоичном коде с плавающей запятой
Часто приходится обрабатывать очень большие числа (например, расстояние между звёздами) или наоборот очень маленькие числа (например, размеры атомов или электронов). При таких вычислениях пришлось бы использовать числа с очень большой разрядностью. В то же время нам не нужно знать расстояние между звёздами с точностью до миллиметра. Для вычислений с такими величинами числа с фиксированной запятой неэффективны.
В десятичной арифметике для записи таких чисел используется алгебраическая форма. При этом число записывается в виде мантиссы, умноженной на 10 в степени, отображающей порядок числа, Например:
Для записи двоичных чисел тоже используется такая форма записи. Она позволяет работать с числами с большим диапазоном значений Эта форма записи называется запись числа с плавающей точкой. Напомним, что мантисса не может быть больше единицы и после запятой в мантиссе не можетзаписываться ноль.
В программировании для записи таких чисел используются специальные форматы переменных. В языке СИ это такие форматы как float и double. Они описываются стандартом . Этих же стандартов придерживается большинство других языков программирования. При работе с числами с плавающей запятой в составе языка программирования обычно не возникает трудностей. Все преобразования форматов чисел осуществляются средствами самого языка программирования. Однако при передаче данных или при работе с микроконтроллерами часто приходится писать программу на языке программирования ассемблер и тогда может потребоваться знание внутреннего представления этих чисел.
Для записи числа в формате с плавающей запятой одинарной точности требуется тридцатидвухбитовое слово. Для записи чисел с двойной точностью требуется шестидесятичетырёхбитовое слово. Чаще всего числа хранятся в нескольких соседних ячейках памяти процессора. Форматы числа в формате с плавающей запятой одинарной точности и числа в формате с плавающей запятой удвоенной точности приведены на рисунке
Рисунок 1. Форматы числа с плавающей запятой
На рисунке буквой S обозначен знак числа, 0 — это положительное число, 1 — отрицательное число.
Группа бит, обозначенная e предназначена для записи смещённого порядка числа. Смещение потребовалось, чтобы не вводить в двоичный код числа с плавающей запятой еще один знак. Смещённый порядок всегда является положительным числом. В двоичном коде одинарной точности float для записи порядка числа выделено восемь бит. Для него смещение порядка числа принято 127. Для смещённого порядка в двоичном коде числа с плавающей запятой двойной точности double отводится 11 бит. В нем смещение порядка числа составляет — 1023.
В десятичной мантиссе после запятой могут присутствовать цифры 1. 9, а в двоичной — только 1. Поэтому для хранения единицы после двоичной запятой не выделяется отдельный бит в числе с плавающей запятой. Единица подразумевается, как и двоичная запятая. Кроме того, в формате чисел с плавающей запятой принято, что мантисса всегда больше 1. То есть диапазон значений мантиссы лежит в диапазоне от 1 до 2.
Рассмотрим несколько примеров:
1) Определить число с плавающей запятой, лежащее в четырёх соседних байтах:
11000001 01001000 00000000 00000000
— Знаковый бит, равный 1 показывает, что число отрицательное.
— Экспонента 10000010 в десятичном виде соответствует числу 130. Вычтя число 127 из 130, получим число 3.
— Теперь запишем мантиссу: 1,100 1000 0000 0000 0000 0000
— И, наконец, определим десятичное число: 1100,1b = 12,5d
2) Определить число с плавающей запятой, лежащее в четырёх соседних байтах:
11000011 00110100 00000000 00000000
— Знаковый бит, равный 1 показывает, что число отрицательное.
— Экспонента 10000110 в десятичном виде соответствует числу 134. Вычтя число 127 из 134, получим число 7.
— Теперь запишем мантиссу: 1,011 0100 0000 0000 0000 0000
— И, наконец, определим десятичное число: 10110100b=180d
Для того чтобы записать ноль, в двоичном представлении числа с плавающей запятой достаточно записать в смещенный порядок число 00000000b. Значение мантиссы при этом не имеет значения. Число, в котором все байты равны 0, тоже попадает в этот диапазон значений.
Бесконечность в числе с плавающей запятой соответствует смещенному порядку 11111111b и мантиссе, равной 1,0. При этом существует минус бесконечность и плюс бесконечность (переполнение и антипереполнение), которые часто отображаются на экран монитора компьютера или дисплей микропроцессорного устройства как +INF и -INF.
Все остальные комбинации битов мантиссы числа с плавающей запятой (в том числе и все единицы) при смещенном порядке 11111111b воспринимаются языками программирования как не числа и отображаются на экран: NaN.
Другие виды двоичных кодов:
Целочисленные двоичные коды Представление двоичных чисел в памяти компьютера или микроконтроллера
https://digteh.ru/proc/IntCod.php
Двоично-десятичный код Иногда бывает удобно хранить числа в памяти процессора в десятичном виде
https://digteh.ru/proc/DecCod.php
Запись текстов двоичным кодом Представление текстов в памяти компьютеров и микроконтроллеров
https://digteh.ru/proc/text.php
Системы счисления В настоящее время и в технике и в быту широко используются как позиционные, так и непозиционные системы счисления.
https://digteh.ru/digital/SysSchis.php
Автор Микушин А. В. All rights reserved. 2001 . 2020
Предыдущие версии сайта:
http://neic.nsk.su/
Об авторе:
к.т.н., доц., Александр Владимирович Микушин
Кандидат технических наук, доцент кафедры САПР СибГУТИ. Выпускник факультета радиосвязи и радиовещания (1982) Новосибирского электротехнического института связи (НЭИС).
А.В.Микушин длительное время проработал ведущим инженером в научно исследовательском секторе НЭИС, конструкторско технологическом центре «Сигнал», Научно производственной фирме «Булат». В процессе этой деятельности он внёс вклад в разработку систем радионавигации, радиосвязи и транкинговой связи.
Научные исследования внедрены в аппаратуре радинавигационной системы Loran-C, комплексов мобильной и транкинговой связи «Сигнал-201», авиационной системы передачи данных «Орлан-СТД», отечественном развитии системы SmarTrunkII и радиостанций специального назначения.
Tools & Thoughts
This page allows you to convert between the decimal representation of numbers (like «1.02») and the binary format used by all modern CPUs (IEEE 754 floating point).
Update
There has been an update in the way the number is displayed. Previous version would give you the represented value as a possibly rounded decimal number and the same number with the increased precision of a 64-bit double precision float. Now the original number is shown (either as the number that was entered, or as a possibly rounded decimal string) as well as the actual full precision decimal number that the float value is representing. Entering «0.1» is — as always — a nice example to see this behaviour. The difference between both values is shown as well, so you can easier tell the difference between what you entered and what you get in IEEE-754.
This webpage is a tool to understand IEEE-754 floating point numbers. This is the format in which almost all CPUs represent non-integer numbers. As this format is using base-2, there can be surprising differences in what numbers can be represented easily in decimal and which numbers can be represented in IEEE-754. As an example, try «0.1». The conversion is limited to 32-bit single precision numbers, while the IEEE-754-Standard contains formats with increased precision.
Usage:
You can either convert a number by choosing its binary representation in the button-bar, the other fields will be updated immediately. Or you can enter a binary number, a hexnumber or the decimal representation into the corresponding textfield and press return to update the other fields. To make it easier to spot eventual rounding errors, the selected float number is displayed after conversion to double precision.
Special Values:
You can enter the words «Infinity», «-Infinity» or «NaN» to get the corresponding special values for IEEE-754. Please note there are two kinds of zero: +0 and -0.
Conversion:
The value of a IEEE-754 number is computed as:
sign 2 exponent mantissa
The sign is stored in bit 32. The exponent can be computed from bits 24-31 by subtracting 127. The mantissa (also known as significand or fraction) is stored in bits 1-23. An invisible leading bit (i.e. it is not actually stored) with value 1.0 is placed in front, then bit 23 has a value of 1/2, bit 22 has value 1/4 etc. As a result, the mantissa has a value between 1.0 and 2. If the exponent reaches -127 (binary 00000000), the leading 1 is no longer used to enable gradual underflow.
Underflow:
If the exponent has minimum value (all zero), special rules for denormalized values are followed. The exponent value is set to 2 -126 and the «invisible» leading bit for the mantissa is no longer used.
The range of the mantissa is now [0:1).
Note: The converter used to show denormalized exponents as 2 -127 and a denormalized mantissa range [0:2). This is effectively identical to the values above, with a factor of two shifted between exponent and mantissa. However this confused people and was therefore changed (2015-09-26).
Rounding errors:
Not every decimal number can be expressed exactly as a floating point number. This can be seen when entering «0.1» and examining its binary representation which is either slightly smaller or larger, depending on the last bit.
Other representations:
The hex representation is just the integer value of the bitstring printed as hex. Don’t confuse this with true hexadecimal floating point values in the style of 0xab.12ef.
FAQ (Frequently Asked Questions):
Can you send me the source code? I need to convert format x to format y.:
This source code for this converter doesn’t contain any low level conversion routines. The conversion between a floating point number (i.e. a 32 bit area in memory) and the bit representation isn’t actually a conversion, but just a reinterpretation of the same data in memory. This can be easily done with typecasts in C/C++ or with some bitfiddling via java.lang.Float.floatToIntBits in Java. The conversion between a string containing the textual form of a floating point number (e.g. «3.14159», a string of 7 characters) and a 32 bit floating point number is also performed by library routines. If you need to write such a routine yourself, you should have a look at the sourecode of a standard C library (e.g. GNU libc, uclibc or the FreeBSD C library — please have a look at the licenses before copying the code) — be aware, these conversions can be complicated.
Can you add support for 64-bit float/16-bit float/non-IEEE 754 float?.:
This page relies on existing conversion routines, so formats not usually supported in standard libraries cannot be supported with reasonable effort. Double-precision (64-bit) floats would work, but this too is some work to support alongside single precision floats. As the primary purpose of this site is to support people learning about these formats, supporting other formats is not really a priority.
I’ve converted a number to floating point by hand/some other method, and I get a different result. Your converter is wrong!
Possible, but unlikely. The conversion routines are pretty accurate (see above). Until now, checking the results always proved the other conversion less accurate. First, consider what «correct» means in this context — unless the conversion has no rounding error, there are two reasonable results, one slightly smaller the entered value and one slightly bigger. The best result is usually the one closer to the value that was entered, so you should check for that. Please check the actual represented value (second text line) and compare the difference to the expected decimal value while toggling the last bits.
Note: If you find any problems, please report them here.
Представление числа float в двоичной системе
Функция: вычислить значение числа по записи этого числа в двоичной системе счисления
Назначение: вычисляет десятичное значение целого числа по заданной строке символов s, который.
Заменить все встречающиеся в тексте числа на эти же числа в двоичной системе счисления
Условие задачи: На планете Роботов очень не любят десятичную систему счисления, поэтому они.
Представление float в двоичной системе
Смысл: требуется написать программу, показывающую двоичную структуру float. Запускаем: вводится.
Представление числа в двоичной системе счисления
Можете объяснить как люди выражают цифры в двоичном системе счисления к примеру цифру 94 — типа.
Решение
Сыроежка, а если указатель использовать?
или область памяти не связана с этим?
Используйте следующую конструкцию
Сыроежка, а с каких пор в языке Си есть static_cast ?
Сыроежка, а с каких пор в языке Си есть static_cast ?
мне это не помогло(
Столько всего понаписали, но «честный» способ так никто и не предоставил.
Решение
Eaax, какая точка?
Я ответил по твоему заданию. В двоичном представении чего бы то ни было- нет точек или запятых и прочая. Есть только ноли и единицы. И спасибо надо говорить.
alkagolik, это работает с любым типом, только надо веместо float написать double и всё будет круто, строчка в 64 символа (если sizeof(double)== 8)
Понтяно. Тогда делается просто:
Eaax, какая точка?
Я ответил по твоему заданию. В двоичном представении чего бы то ни было- нет точек или запятых и прочая. Есть только ноли и единицы. И спасибо надо говорить.
alkagolik, это работает с любым типом, только надо веместо float написать double и всё будет круто, строчка в 64 символа (если sizeof(double)== 8)
См. пост #16.
Такой ответ преподавателя говорит о его плохой квалификации (если я правильно тебя понял). Вариант решения из поста #10 с идеологической точки зрения более правильный (чем вариант из поста #16), но написано топорно. Хотя для преподавателя самое то — сразу видно, что человек сам делал
См. пост #16.
Такой ответ преподавателя говорит о его плохой квалификации (если я правильно тебя понял). Вариант решения из поста #10 с идеологической точки зрения более правильный (чем вариант из поста #16), но написано топорно. Хотя для преподавателя самое то — сразу видно, что человек сам делал
В машине нет никаких плюсов или минусов. В машине кроме нулей и единиц ничего нет. Машина только умеет их трактовать (в товём случае как плюс или минус). Но от этого образ памяти не изменяется — в памяти всё равно лежат нули и единицы