Как переносить запись двойного типа данных в файл на C - PullRequest
0 голосов
/ 10 января 2019

Мне нужно хранить double значения в файле таким образом, чтобы он был переносимым. Я знаю, что могу написать их в удобочитаемой для человека форме, например, 1.23456789, но я надеюсь сэкономить место, записав их в двоичном виде.

Я знаю, как записать двоичный файл в файл, но есть ли способ сделать это так, чтобы результирующий файл был одинаковым независимо от компьютера, на котором был скомпилирован и выполнен код? Я надеюсь, что смогу читать / записывать такие файлы на разных компьютерах таким образом.

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Если компьютер, который вы используете для сериализации значения double, использует двойную точность IEEE 754 для значений double, вы можете хранить знак, экспоненту и мантиссу отдельно, чтобы вы могли использовать эту информацию для восстановления двойное значение в любой другой системе, в которую вы хотите загрузить его:

typedef union _DI
{
    double d;
    uint64_t bits;
} DI;


DI foo;
uint64_t mask = 0x8000000000000000, sign, exp, mantissa, base;
int i;

foo.d = 3.141;
sign = !!(foo.bits & mask);

mask = 0x7FF0000000000000;
exp = ((foo.bits & mask) >> 52) - 1023;

mask = 0x000FFFFFFFFFFFFF;
mantissa = (foo.bits & mask);

Обратите внимание, что мантисса должна быть также нормализована .

0 голосов
/ 11 января 2019

Простой ответ - нет. Не существует двоичного переносимого способа записи чисел с плавающей запятой в двоичной форме. Даже если вы будете следовать документу IEEE-752, вы обнаружите, что можете хранить байты, соответствующие плавающей запятой, в разных порядках (например, большие / маленькие порядковые числа для целых чисел)

Существует несколько протоколов IETF (наиболее известный протокол IPFIX), которые определяют формат для передачи чисел с плавающей запятой IEEE-752 в так называемый (там) сетевой формат. Это вынуждает записывать число в мажорном или минусовом весе, но, например, это вынуждает машины с низким порядком байтов (например, Intel) менять местами байты при чтении / записи в провод.

Итак, что делают люди? хорошо, если вы хотите сохранить свои данные, вам лучше определить свой собственный формат и всегда следовать ему в своих проектах. В зависимости от архитектуры. Если вам повезло быть первым, когда другим нужно получить доступ к вашим данным, вы можете сказать им, как эти данные хранятся и все могут следовать вашим спецификациям, вместо того, чтобы самим приспосабливаться к их.

0 голосов
/ 10 января 2019

Вы всегда можете вывести число в соответствии с IEEE 754. Это также наиболее часто используемый формат в современных процессорах, но если вы хотите быть переносимым, вам нужно вычислить соответствующие поля (знак / экспонента / дробь) в требуемых Точность программно вместо непосредственного использования в памяти представления текущей платформы.

Другой альтернативой является использование чисел с фиксированной точкой. Если диапазон чисел и точность, которую вы хотите представить, позволяют, это может быть более простой альтернативой.

...