Я бы посмотрел на это с другой точки зрения.Если данные хранятся как float
, то это та точность, которая у них когда-либо будет.Нет смысла конвертировать в double
, пока этого не потребуют правила арифметики с плавающей запятой.
Поэтому я бы выделил буфер для 500 (или чего-то еще) float
с и считал их из данныхфайл с одним подходящим вызовом на fread()
:
float *databuffer;
//...
databuffer = malloc(500 * sizeof(float));
fread(databuffer, sizeof(Float), 500, f);
Позже, используйте данные в любой математике, в которой они должны участвовать. Они будут повышены до double
, если потребуется.Не забудьте в конце концов освободить буфер после того, как он больше не нужен.
Если ваши результаты действительно имеют всю точность, равную double
, то используйте новый буфер double
s, чтобы удерживать их,Однако, если они должны быть записаны обратно в файл как float
, вам, в конечном счете, нужно будет поместить их в буфер float
s.
Обратите внимание, что для чтения и записи файлов для обмена часто требуетсяследует рассматривать как отдельную проблему от эффективного хранения и использования данных в памяти.Часто необходимо прочитать файл и каким-то образом обработать каждое отдельное значение.Например, переносная программа может потребоваться для обработки данных, записанных системой с использованием другого порядка байтов.Сегодня реже вы можете обнаружить, что даже расположение битов в float
отличается в разных системах.В общем, эту проблему часто лучше всего решить, если обратиться к библиотеке, реализующей стандарт, такой как XDR (определенный RFC 4506 ), который был разработан для работы с двоичной переносимостью.