LINUX.ORG.RU

[bin file] Что это за формат записи числа с плавающей запятой?


0

1

В продолжение темы.

Пытаюсь понять, как в некотором формате файлов записаны числа с плавающей запятой. Они там восьмибайтные. Есть само число в файле и его расшифровка проприетарной софтиной.

При записи числа вот таким образом:

    typedef double Flt_t;
    Flt_t x = 0.0956802824951; // первое число из примера
    fwrite(&x, sizeof(x), 1, pFile);
получаются похожие последовательности байтов. Но лишь похожие, а не такие же.

число
представление в файле
представление после fwrite

0.0956802824951
BC 34 30 C4  80 7E B8 3F
42 41 30 C4  80 7E B8 3F

0.0101753947348
EE DF E0 5C  D6 D6 84 3F
7E FC E0 5C  D6 D6 84 3F

0.1596829962353
86 62 47 0F  7E 70 C4 3F
6B 69 47 0F  7E 70 C4 3F

-0.0132055462248
07 38 4A 69  82 0B 8B BF
92 68 4A 69  82 0B 8B BF

-0.0390213781919
C4 9E 5B 2E  9C FA A3 BF
81 AD 5B 2E  9C FA A3 BF

Как записать число так, чтобы формат получился нужным? И как считывать такие числа? Я в этом деле вообще не разбираюсь.

★★★★★

Последнее исправление: Obey-Kun (всего исправлений: 1)

по виду - обычный double, различия в младших байтах мантиссы. так что разница там мала, видимо софтина округляет. на примере первого числа: sign == 0; exp == 0x3FB; mantissa == 0x8 7E 80 C4 30 41 42.

value = 2^(exp-1023)*1.mantissa = 2^(-56)*0x18 7E 80 C4 30 41 42 =

0.0956802824951

http://en.wikipedia.org/wiki/Double_precision

registrant ★★★★★
()

Скажите, пожалуйста:

1.А с ненулевой целой частью примеров нет?
2.Есть ли вероятность, что софтина выдает на экран не совсем то же, что записывает в файл, например, за счет округления?

proud_anon ★★★★★
()
Ответ на: комментарий от registrant

Понятно, то есть всё правильно записываю. Спасибо.

Obey-Kun ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.