Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
wasabi
Зарегистрирован: 11.06.2004 Сообщения: 3 Откуда: Moscow
|
Добавлено: Чт Июл 01 2004 15:33 Заголовок сообщения: Внутреннее представление формата Extended (10 байт) |
|
|
Помогите, пожалуйста. Переписываю программу с Delphi на GNU C. На Delphi программа записывет в файл число Extended. Надо его прочитать, а типа размером 10 байт, насколько я знаю, в Си нет.
Всвязи с чем самым разумным мне кажется способ найти описание внутреннего представления числа Extended и ковертировать его ручками в long double. |
|
Вернуться к началу |
|
|
grayrat
Зарегистрирован: 30.06.2003 Сообщения: 189
|
Добавлено: Чт Июл 01 2004 17:04 Заголовок сообщения: |
|
|
Это в visual C нет. А в Gnu, на сколько я помню, есть long double. |
|
Вернуться к началу |
|
|
wasabi
Зарегистрирован: 11.06.2004 Сообщения: 3 Откуда: Moscow
|
Добавлено: Чт Июл 01 2004 23:28 Заголовок сообщения: |
|
|
Цитата: | Это в visual C нет. А в Gnu, на сколько я помню, есть long double. |
long double занимает 12 байт. Правда у него последние два почти всегда равны 0 (я не нашел ни одного примера, когда хотя бы один бит из последних 16 был бы отличен от 0). При этом представлнение чисел в формате Extended и long double отличаются. |
|
Вернуться к началу |
|
|
Andy_user
Зарегистрирован: 03.12.2003 Сообщения: 382 Откуда: Санкт-Петербург
|
Добавлено: Пт Июл 02 2004 09:14 Заголовок сообщения: |
|
|
Тип числа с повышенной точностью
Десятибайтовое (80-битовое) число типа Extended подразделяется на четыре поля:
1 разряд - s - знак;
15 разрядов - e - експонента;
1 разряд - i - (?);
63 разряда - f - мантисса
---
Значение v этого числа определяется с помощью выражений:
if 0 < e < 32767, then v = (-1)^s * 2^(e-1023) * (i.f).
if e = 32767 and f = 0, then v = (-1)^s * Inf.
if e = 32767 and f <> 0, then v = NaN.
---
Что-то вроде этого.
Извините, если не так, давно это было... |
|
Вернуться к началу |
|
|
grayrat
Зарегистрирован: 30.06.2003 Сообщения: 189
|
Добавлено: Пт Июл 02 2004 09:16 Заголовок сообщения: |
|
|
Первый раз слышу чтобы long double занимал 12 байт !
выполни вот это:
Код: | #include <stdio.h>
void main()
{
printf( "%d\n", sizeof(long double) );
} |
12 байт, наверное, получается из-за того что стоит выравнивание на границу двойного слова
10 байт в long double это как раз соответствует внутреннему представлению типов с плавающей точкой в процессорах семейства х86, а 12 - это, извените, не пришей рукав к одному месту, как говорится |
|
Вернуться к началу |
|
|
|