Есть ли в С++ отрицательный ноль?
#опытным
Вопрос странный, но тем не менее проверяет кучу вещей: ваши знания базы, подкапотных механизмов и изменений в стандартах. Поехали
Какие у нас вообще числа есть?
Знаковые и беззнаковые целые, а также вещественные. Начнем с простого.
В беззнаковых числах не может быть отрицательного нуля, очевидно.
А вот со знаковыми уже начинаются вопросы. Да, в матеше ноль в целых числах представлен в единственном экземпляре. А компьютеры не всегда могут эмулировать в точности математические концепции. Про целые числа у нас есть серия постов: затравка и начало серии.
Так вот С++ разрешал использование методов обратного кода и знак-амплитуда для представления отрицательных чисел. И у них есть положительный и отрицательный ноль.
Но в С++20 стандарте четко зафиксировали использование дополнительного кода, в котором только один ноль.
А что с вещественными числами?
Тут вообще зоопарк. Стандарт говорит, что формат вещественных чисел задается компилятором по своему усмотрению. Но большинство реализаций выбирают IEEE 754.
Там вещественное число задается тремя параметрами: знак, экспонента и мантисса. Значение можно вычислить по такой формуле:
value=(−1)^S × 2^E × (1+M)
Ноль задается нулевой мантиссой и экспонентой. Но у нас же есть и знаковый бит еще. Поэтому на большинстве платформах в С++ есть отрицательный вещественный ноль. Кстати наряду с положительными и отрицательными бесконечностями.
Be positive. Stay cool.
#compiler #base #cpp20
#опытным
Вопрос странный, но тем не менее проверяет кучу вещей: ваши знания базы, подкапотных механизмов и изменений в стандартах. Поехали
Какие у нас вообще числа есть?
Знаковые и беззнаковые целые, а также вещественные. Начнем с простого.
В беззнаковых числах не может быть отрицательного нуля, очевидно.
А вот со знаковыми уже начинаются вопросы. Да, в матеше ноль в целых числах представлен в единственном экземпляре. А компьютеры не всегда могут эмулировать в точности математические концепции. Про целые числа у нас есть серия постов: затравка и начало серии.
Так вот С++ разрешал использование методов обратного кода и знак-амплитуда для представления отрицательных чисел. И у них есть положительный и отрицательный ноль.
Но в С++20 стандарте четко зафиксировали использование дополнительного кода, в котором только один ноль.
А что с вещественными числами?
Тут вообще зоопарк. Стандарт говорит, что формат вещественных чисел задается компилятором по своему усмотрению. Но большинство реализаций выбирают IEEE 754.
Там вещественное число задается тремя параметрами: знак, экспонента и мантисса. Значение можно вычислить по такой формуле:
value=(−1)^S × 2^E × (1+M)
Ноль задается нулевой мантиссой и экспонентой. Но у нас же есть и знаковый бит еще. Поэтому на большинстве платформах в С++ есть отрицательный вещественный ноль. Кстати наряду с положительными и отрицательными бесконечностями.
Be positive. Stay cool.
#compiler #base #cpp20