Хранение 32-разрядного числа с плавающей точкой в ​​проблемах переносимости файла - PullRequest
2 голосов
/ 16 июля 2011

Если я сохраню число с плавающей точкой в ​​файле с помощью этого кода

fwrite((void*)(&v), sizeof(v), 1, f); // v is a float.

как часто программа, читающая файл с этим кодом, будет вызывать ошибку времени выполнения, поскольку число с плавающей запятой равно 8 байтам вместо 4?

float v;
fread((void*)(&v), sizeof(v), 1, f);
return v;

Могу ли я всегда читать 4 байта и преобразовывать их в 8-байтовое число?Будет ли это более портативным?

Акцент на разных платформах Windows 64-битные против 32-битных.

Ответы [ 5 ]

6 голосов
/ 16 июля 2011

Я бы меньше беспокоился о размере поплавка и больше беспокоился бы о его порядке байтов.Я бы сказал, что подавляющее большинство реализаций C ++ используют IEEE 754, что означало бы, что значение float всегда будет 32 битным и двойным 64 битным.

Возможно, вы захотите просто сериализовать текстовое представление значения, иначебудьте особенно внимательны, чтобы убедиться, что порядок байтов правильный.

2 голосов
/ 16 июля 2011

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

  • * 1004 порядок байт *
  • размеры элементов
  • различные форматы для float и др.
  • обивка / выравнивание
  • прямая / обратная совместимость между различными версиями программы

Это также делает данные доступными для других программ, если это необходимо.

Недостатком, конечно, является то, что текст требует больше памяти, поэтому, если у вас много данных, текст может не подойти

1 голос
/ 16 июля 2011

Размер float может измениться, но double - нет.Вы уверены, что было бы лучше использовать double, чем для этой цели?A double всегда 8 байтов.

0 голосов
/ 16 июля 2011

На платформе Windows, sizeof(float) всегда 4 байта, независимо от того, является ли он 32-битным или 64-битным процессом / ОС. Не знаю насчет стандарта , но на большинстве платформ размер поплавка составляет четыре байта.

0 голосов
/ 16 июля 2011

float довольно универсален в обращении к IEEE с плавающей точкой одинарной точности, независимо от того, является ли платформа 32-битной или 64-битной.

...