Re: 6-ти байтный real в С++
От: zelyony  
Дата: 20.05.04 04:01
Оценка: 6 (2)
> Проблема в том, что там в основном используется 6-ти байтный real (в delphi его заменили на 8-ми байтный и ныне он синоним double).
> Так вот как все-таки преборазовать его в чего-нить приличное (float, double).

typedef unsigned short word;

struct Real {
    word lo, mid, hi;
    Real( word l, word m, word h) : lo(l), mid(m), hi(h) { }
};

double real2double( Real r) {
    union {
        double d;
        struct {
            unsigned lo;
            unsigned hi;
        };
    } u;
    u.hi = (r.hi & 0x8000) << 16; // sign
    r.hi &= 0x7fff; // mask sign
    u.hi |= ((unsigned(r.lo & 0xff) - 129) + 1023) << 20; // exp
    u.hi |= unsigned(r.hi) << 5; // fraction
    u.hi |= r.mid >> 11;
    u.lo = unsigned(r.mid & 0x7ff) << 21;
    u.lo |= unsigned(r.lo & 0xff00) << 5;
    return u.d;
}
Posted via RSDN NNTP Server 1.9 alpha
6-ти байтный real в С++
От: svix Россия  
Дата: 19.05.04 08:32
Оценка:
Нужно прочитать файл с паскалевскими записями.

Проблема в том, что там в основном используется 6-ти байтный real (в delphi его заменили на 8-ми байтный и ныне он синоним double).
Так вот как все-таки преборазовать его в чего-нить приличное (float, double).
Пишу на visual C++ и поэтому советы типа: "а напиши дельфевую компоненту и юзай" не подойдут.
Максимум чего я раскопал про real это то, что у него 1 бит — знак; след. 39 бит — это мантисса. И последние 8 — порядок.

Помогите, очень надо !!!
Re: 6-ти байтный real в С++
От: Аноним  
Дата: 19.05.04 08:38
Оценка:
В С/С++ нет такого типа real. Чтобы преобразовать из файла, созданного программой на паскале, ИМХО тебе придется повозиться — посмотреть, как устроен real (или как его там в паскале), затем почитать какой-нить там IEEE 7xxx или что — то в этом роде — стандарт вещественных чисел, который использует вижуал (в мсдн он подробно описан), и конвертировать.
Re: 6-ти байтный real в С++
От: maq Россия http://www.maqdev.com
Дата: 19.05.04 09:32
Оценка:
Вот код из исходников RTL TurboPascal:
; Convert Real to Extended

FRealExt:

    OR    AL,AL
    JE    @@1
    XOR    CL,CL
    MOV    CH,AH
    MOV    AH,DH
    AND    AH,80H
    ADD    AX,3F7EH
    OR    DH,80H
    PUSH    AX
    PUSH    DX
    PUSH    BX
    PUSH    CX
    XOR    CX,CX
    PUSH    CX
    MOV    BX,SP
    FLD    TBYTE PTR SS:[BX]
    FWAIT
    ADD    SP,10
    RETF
@@1:    FLDZ
    RETF


Только extended это пока не double, но очень близко — надо глянуть справочник по сопроцессору
как получить double
Re: 6-ти байтный real в С++
От: adb Россия  
Дата: 19.05.04 13:42
Оценка:
Здравствуйте, svix, Вы писали:

S>Нужно прочитать файл с паскалевскими записями.


S>Проблема в том, что там в основном используется 6-ти байтный real (в delphi его заменили на 8-ми байтный и ныне он синоним double).

S>Так вот как все-таки преборазовать его в чего-нить приличное (float, double).
S>Пишу на visual C++ и поэтому советы типа: "а напиши дельфевую компоненту и юзай" не подойдут.
S>Максимум чего я раскопал про real это то, что у него 1 бит — знак; след. 39 бит — это мантисса. И последние 8 — порядок.

S>Помогите, очень надо !!!


По-моему проще написать на паскале конвертилку из бинарного файла в текстовый. Тогда вообще не будет никаких заморочек. Ни с выравниванием, ни с real.
Re: 6-ти байтный real в С++
От: AnatolB  
Дата: 19.05.04 14:27
Оценка:
class Real
{
    BYTE buf[6];
public:
    ...
    operator double() { ... }
    void GetFromFile(FILE *file) { ... }
}

;)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.