Russian Qt Forum
Октябрь 02, 2024, 01:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Float on 64-bit  (Прочитано 9350 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Апрель 19, 2011, 14:43 »

Цитировать
Размер данных на диске не обязан совпадать с их размером в памяти
Это как это  Непонимающий
Как хотим - так и храним. Захотели float сохранили как double - или наоборот. Частенько храню bool как int. Порядок байтов тоже может быть разный (хотя большая ендиана уже история)

Люби и знай свой язык. Понимание приходит через фтыкание в строчки стандарта ISO С++. Все иное от лукавого.
Ой как нравится разговаривать "в повелительном наклонении" Улыбающийся Значит, я так понимаю, Вы-то уж свой язык любите и знаете. Тогда поясните мне пожалуйста: кто быстрее работает: float или double ?
Спасибо 
Записан
romank
Гость
« Ответ #16 : Апрель 19, 2011, 14:45 »

Зачем вы ещё пишете в эту тему?
Решение найдено и решение не касается стандарта ISO, компилятора и, как это часто бывает, собственно темы.
Пять копеек с повелительными наклонениями засуньте обратно и перечитывайте _полностью_ обсуждение.

P.S. У меня бл большая ендиана!
Записан
maxxant
Гость
« Ответ #17 : Апрель 19, 2011, 14:50 »

но на 64 битах sizeof(float)=8 что подобрать под 4 байта не могу найти.

начиная с версии Qt 4.6 сериализация float идет в 8 байт по умолчанию. Nokia писали об этом в Labs.

Код:
QDataStream &QDataStream::operator>>(float &f)
{    
    if (version() >= QDataStream::Qt_4_6
        && floatingPointPrecision() == QDataStream::DoublePrecision) {
        double d;
        *this >> d;
        f = d;
        return *this;
    }

    f = 0.0f;
    CHECK_STREAM_PRECOND(*this)
    if (dev->read((char *)&f, 4) != 4) {
        f = 0.0f;
        setStatus(ReadPastEnd);
    } else {
        if (!noswap) {
            union {
                float val1;
                quint32 val2;
            } x;
            x.val2 = qbswap(*reinterpret_cast<quint32 *>(&f));
            f = x.val1;
        }
    }
    return *this;
}

потому иногда приходиться явно указывать версию в QDataStream, чтобы при переходе на новую версию Qt не поломать бинарную совместимость на уровне чтения-записи данных.

Код:
  QDataStream stream(&data, QIODevice::WriteOnly);
  stream.setVersion(QDataStream::Qt_4_5);
  ...
Записан
romank
Гость
« Ответ #18 : Апрель 19, 2011, 14:54 »

Спасибо за грамотный ответ.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.043 секунд. Запросов: 23.