Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpPmNuFT 30 of 390 menu
◀ ▶

Дробные типы в C++

Дробные числа в C++ представлены двумя типами: float и double. Разница между ними также проявляется в количестве байт, которые они занимают в памяти: 4 и 8 байт соответственно.

Дробные числа хранятся в памяти не так, как целые и при этом не совсем точно. Каждое такое число состоит из трех частей: знак, порядок и значащие цифры. Давайте разберемся, как это работает.

Знак занимает один бит. Он показывает, число положительное или отрицательное: плюс перед ним или минус.

Порядок запоминает, где стоит точка. Цифры при этом могут быть те же. Число 314, число 3.14 и число 0.0314 собраны из цифр 3, 1 и 4, а точка сдвинута. Этот сдвиг и хранит порядок.

Значащие цифры - это само число: сколько цифр ячейка успевает запомнить. На все цифры места часто не хватает. Лишние справа отбрасываются, и в памяти остается число, близкое к записанному.

У типа float ячейка занимает 4 байта, это 32 бита. Их делят так: 1 бит на знак, 8 бит на порядок и 23 бита на значащие цифры. При этом 23 бита хватает примерно на 7 обычных цифр.

У типа double ячейка вдвое больше: 8 байт, это 64 бита. Знак снова занимает 1 бит. На порядок отведено 11 бит, поэтому число может быть гораздо больше или гораздо меньше. На значащие цифры остается 52 бита. Это примерно 15 обычных цифр, и записанное число получается ближе. Для обычных расчетов берут double.

Бит умеет быть только 0 или 1. Дробь в этих битах собирают из половин, четвертей и следующих таких же долей.

Половина пишется коротко. Двоичная запись 0.1 - это ровно 0.5. Четверть - это двоичное 0.01, то есть 0.25. Обе дроби из битов складываются без хвоста.

Одна десятая так не выходит. Ее двоичная запись начинается как 0.0001100110011..., и кусок 0011 повторяется без конца. Ячейка обрывает хвост. В нее ложится ближайшее число, которое получается из битов, и оно чуть отличается от одной десятой. Поэтому счет на дробных типах иногда дает результат рядом с ожидаемым.

Беззнаковых дробных типов нет. Минус уже сидит в бите знака. Слово unsigned перед float или double язык не принимает.

Сведем дробные типы:

Тип Байты Знак Порядок Значащие цифры
float 4 1 бит 8 бит около 7
double 8 1 бит 11 бит около 15

Сколько байт занимает тип float?

Сколько байт занимает тип double?

Из каких трех частей состоит ячейка дробного числа?

Сколько значащих цифр хранит тип float?

Сколько значащих цифр хранит тип double?

Бывает ли беззнаковый дробный тип?

Есть число 12.345. Хватит ли типу float значащих цифр, чтобы запомнить его целиком?

Есть число 1234567.8. Хватит ли типу float значащих цифр, чтобы запомнить его целиком?

Есть число 1234567.8. Хватит ли типу double значащих цифр, чтобы запомнить его целиком?

Есть число 123456789012345.0. Хватит ли типу double значащих цифр, чтобы запомнить его целиком?

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить