В форматах с плавающей запятой существует гораздо больше потенциальных вариаций и проблем, чем просто проблема с порядком байтов, с которой вам приходится сталкиваться при маршалинге и демаршаллинге целых чисел.
Одним из выходов является форматирование чисел с плавающей запятой в виде текста с использованием printf
и считывание их обратно с помощью strtof()
(как указано в bmargulies).
Другой способ, который будет работать, пока машины имеют одинаковое значение FLT_RADIX
, состоит в том, чтобы разбить их на значения мантиссы и показателя степени:
#include <math.h>
#include <limits.h>
float x = 1.13;
int x_exp;
long x_mant;
x_exp = ilogbf(x);
x_mant = (scalbnf(fabsf(x), -x_exp) - 1) * LONG_MAX;
if (x < 0.0)
x_mant = -x_mant;
Затем у вас есть int
и long
(x_exp
и x_mant
из приведенного выше кода) для подключения к проводу, которые вы можете использовать для выполнения обычных функций ntohl()
и htonl()
, Чтобы преобразовать их обратно в float
, используйте:
x = scalbnf((fabsf(x_mant) / LONG_MAX) + 1, x_exp);
if (x_mant < 0)
x = -x;
Обратите внимание, что большинство машин имеют значение FLT_RADIX
(определенное в float.h
), равное 2, поэтому, если вы проверите это во время компиляции и прервете, если это что-то еще, вы должны быть достаточно переносимы.