netch80: (Default)
netch80 ([personal profile] netch80) wrote2025-03-13 07:00 am

%a

Из серии "мелких удивлений", почему так всё странно:
Когда появилась двоичная плавающая точка, естественно было бы ожидать, что сразу появится и вариант текстового ввода-вывода в двоичном виде (возможно, свёрнутого до восьмеричного или шестнадцатиричного), который даёт:
1) точность передачи значения;
2) избавление от сложного и дорогого кода преобразования путём умножения и деления (который ещё долго был неточным, а для точного требуется многословная арифметика - для double это 1000+ бит в предельном случае, а ещё база констант в помощь самому преобразованию и тонкая шлифовка частных случаев).

Пример: "0x1.921fb54442d18p+1" (число π в double).

Тем не менее, в Fortran этого нет до сих пор, насколько я знаю - а там я ожидал бы в первую очередь. В C появилось в C99 ("%a" в printf, scanf). Аналогичные форматные методы ещё в десятке актуальных языков (Go, Lua, Matlab, OCaml, Perl, PHP, R, Ruby, Rust, Swift, Zig, спасибо ИИ за поиск). В C++ - режим iostream, с C++11 (std::hexfloat). В Python, Ada, Java, Julia, Haskell - нет форматного знака, есть отдельные методы (например, hex(), from_hex()). В некоторых других - требуются отдельные библиотеки, особенно странно про Javascript, где и целых-то нет, есть double на всё.

Инерция эта выглядит более психологическим, чем технологическим фактором.
gegmopo4: (Default)

[personal profile] gegmopo4 2025-03-13 10:20 am (UTC)(link)

Для людей цей формат нечитабельний, а для машини бінарний формат простіший і швидший. Єдине застосування цього формату, що приходить мені на думку, -- якщо ви імплементуєте IEEE 754 чи щось пов'язане. Але це настільки рідкісний випадок, що і спеціальна бібліотека годиться.

gegmopo4: (Default)

[personal profile] gegmopo4 2025-03-13 06:27 pm (UTC)(link)

Досвіду немає, бо воно практично нікому не потрібно. Ось буквально вчора розбирався з багованим fma() -- цей формат використовувався в тестах. Хоча можна було б і без нього обійтися. А перед цим я стикався з цим форматом може раз на пару років.

35 років тому я читав з екрану 8-ковий дамп пам'яті -- це був мій дизасемблер. Якби довелося так копатися в плаваючій точці -- написав би конвертер, якщо немає готового. Але це виняткові випадки, більшості програмістів це не потрібне буде ніколи в житті.