простое преобразование в гекс / поплавок - PullRequest
2 голосов
/ 11 марта 2010

Я делаю некоторый ввод / вывод между программой на c ++ и программой на python (только значения с плавающей запятой). Питон имеет замечательную функцию преобразования значений с плавающей запятой в шестнадцатеричные числа и обратно, как вы можете видеть по этой ссылке:

http://docs.python.org/library/stdtypes.html#additional-methods-on-float

Есть ли в C ++ легкий путь к чему-то похожему? и преобразовать вывод Python обратно в C ++ double / float? Таким образом, у меня не было бы проблемы округления ошибок при обмене данными между двумя процессами ...

спасибо за ответы!

Ответы [ 7 ]

5 голосов
/ 11 марта 2010

По ссылке, указанной вами в вашем вопросе ( Дополнительные методы на Float ):

Этот синтаксис похож на синтаксис указанные в разделе 6.4.4.2 Стандарт C99, а также синтаксис используется в Java 1.5 и далее. В в частности, вывод float.hex () может использоваться как шестнадцатеричный литерал с плавающей точкой в ​​C или Java код и шестнадцатеричные строки получены символом формата% C или Java Double.toHexString принимаются float.fromhex ().

Пример:

#include <cstdio>

int main() {
  float f = 42.79;
  printf("%.2f == %a\n", f, f);  
  fscanf(stdin, "%a", &f);
  printf("%.2f == %a\n", f, f);  
}

Запустите его:

$ g++ *.cpp && (python -c'print 12.34.hex()' | ./a.out )

Выход:

42.79 == 0x1.5651ecp+5
12.34 == 0x1.8ae148p+3
2 голосов
/ 11 марта 2010

Можете ли вы отправлять необработанные двоичные данные между двумя вместо строк?Пакет struct стандартной библиотеки Python может распаковывать необработанные данные в объект с плавающей точкой Python.

1 голос
/ 11 марта 2010

Если вы на платформе, чья системная библиотека C поддерживает C99, вы можете просто использовать printf( ) и scanf( ) со спецификатором формата %a. Для чтения таких значений вы также можете использовать функции C99 strtod( ), strtof( ) и strtold( ):

float value = strtof(string, NULL, 0);

Вы можете при желании заменить NULL на char **, чтобы получить указатель на конец последовательности преобразованных символов, и 0 на известную базу для строкового представления (если вы установите базу в ноль, он будет выводить основание из формата, он будет отлично анализировать шестнадцатеричные числа с питоном, а также обрабатывать обычные десятичные числа с плавающей запятой)

Если ваш поставщик компиляторов / библиотек решил не заботиться о C99 (в основном MSVC), вам, вероятно, не повезет, пока эти функции не будут включены в стандарт C ++ (я считаю, что они находятся в проекте C +) + 0x, но я не совсем уверен).

1 голос
/ 11 марта 2010

C ++ не имеет библиотечных подпрограмм для преобразования шестнадцатеричного числа в число с плавающей запятой. Одна из причин заключается в том, что внутреннее представление с плавающей запятой не стандартизировано (хотя многие компиляторы действительно используют стандарт IEEE).

Я рекомендую хранить в формате ASCII, который переносим на разные платформы. Вы можете написать свою собственную библиотеку (или найти другую), которая будет преобразовывать формат IEEE (в шестнадцатеричном формате) во внутреннее представление.

1 голос
/ 11 марта 2010

Вы сильно ошибаетесь, если считаете, что это решит все ваши проблемы. Шестнадцатеричная запись в точности эквивалентна оригинальной переменной. Он просто использует другое представление.

1 голос
/ 11 марта 2010

Документы там говорят, что %a делает это в C.

0 голосов
/ 11 ноября 2013

C ++ 11 предлагает std :: hexfloat: IO манипуляторы, включая hexfloat

Если вы можете использовать C ++ 11, то hexfloat довольно прост в использовании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...