
Шестнадцатеричная запись чисел с плавающей точкой в C++, Java, Go
RodionGork 14 минут назад Шестнадцатеричная запись чисел с плавающей точкой в C++, Java, Go Простой 5 мин 586 Программирование * Java * C * Go * C++ * Эта возможность есть в нескольких популярных языках программирования...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: RodionGork 14 минут назад Шестнадцатеричная запись чисел с плавающей точкой в C++, Java, Go Простой 5 мин 586 Программирование * Java * C * Go * C++ * Эта возможность есть в нескольких популярных языках программирования - но она настолько невостребованна, что и не все-то коллеги о ней знают - а в других не менее популярных языках её отказываются добавлять, несмотря на запросы энтузиастов. В этой коротенькой заметке-памятке - взглянем на формат записи (он может показаться не вполне логичным и не вполне шестнадцатеричным, вопреки названию) и поддержку стандарта разными языками. Основным же применением для этой "фичи" может быть, наверное - троллить друг друга на собеседованиях :)Если вам случалось использовать такую запись на практике - поделитесь в комментариях.
Или хотя бы если вы можете придумать случай когда она потенциально пригодится. МотивацияВероятно почти все помнят популярное представление чисел с плавающей точкой (стандарт IEEE 754) - в 4 или 8 байтах хранятся пара двоичных чисел - мантисса и экспонента (со знаками). По аналогии с тем как мы записываем число в "научной" нотации, вроде 2.
Технические детали
026 * 10^3 - внутри используется похожее двоичное представление. 101*10^11 (если все компоненты этой записи считать двоичными) будет числом 101 т. Есть проблема с тем что хотя любое такое дробное двоичное число можно записать в виде конечного десятичного (потому что 2 делитель 10), но обратное не верно.
1 (одна десятая) представить конечной двоичной дробью нельзя. Это обнаруживается даже при простейших вычислениях:print(1. 09999999999999987Иногда это может вести к неприятным проблемам:s = 0 i = 0 while s !
125 i += 1 print(i)Этот хрестоматийный школьный пример печатает количество итераций - их будет 8 если переменная увеличивается на 0. 125 однако замените инкремент на 0. 2 - и получается бесконечный цикл, поскольку значение переменной не окажется равным точно 1 после 10 или 5 итераций соответственно - и цикл проскочит мимо условия выхода.
Отраслевые последствия
И вот кому-то показалось желательным, чтобы можно было при необходимости задать точное двоичное представление числа с плавающей точкой. Конечно двоичными цифрами записывать его неудобно (длинновато), поэтому использовали шестнадцатеричные. ФорматЧисло начинается с 0x как и целые шестнадцатеричные числа.
Дальше следуют шестнадцатеричные разряды и, возможно, точка - хотел было написать "десятичная точка", но она не десятичная по смыслу. 8 - это было бы "полтора". Но такую запись компилятор не пропустит.
Обязательно нужен разделитель экспоненциальной части - в виде буквы p (латинская "пэ и собственно экспоненциальная часть, хотя бы просто 0. То есть наше "полтора" можно записать как 0x1. Выглядит жутковато, да?
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.




