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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Float on 64-bit  (Прочитано 9457 раз)
romank
Гость
« : Апрель 19, 2011, 12:34 »

Добрый день.
Подскажите как создать float тип размером гарантированно 4 байт на 64 битной машине?
Проблема такая - надо прочитать бинарный файл, где числа представлены как 4 байтные float числа. На win32 проблем нет (использую QDataStream >> (float)), но на 64 битах sizeof(float)=8 что подобрать под 4 байта не могу найти.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Апрель 19, 2011, 12:37 »

Все уже сделано:
qint8
qint16
qint32
qint64
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
zenden
Гость
« Ответ #2 : Апрель 19, 2011, 12:43 »

romank
кто вас так жестоко обманул?
sizeof(float)==4 как в win32 так и в win64

По стандарту IEEE 754  он имеет размер 32 бита

Вот кстати таблица сравнения платформ, ни слова про float и double.
Все интегральные типы в Win64 (не связанные с указателями) имеют такой же размер, как и в Win32.


(Linux  - LP64, Windows - LLP64)
« Последнее редактирование: Апрель 19, 2011, 12:59 от zenden » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Апрель 19, 2011, 13:11 »

romank
кто вас так жестоко обманул?
sizeof(float)==4 как в win32 так и в win64
Добавлю что так же и на Mac платформе.
Записан
romank
Гость
« Ответ #4 : Апрель 19, 2011, 13:14 »

Да, точно 4. Неверно диагностировал проблему. Не могу понять.

Код
C++ (Qt)
...
   QDataStream in;
...
   float qfloat;
   inline float readSingle()
   {
       in >> qfloat;
       return qfloat;
   }
 
   qint32 qint;
   inline int readInt32()
   {
       in >> qint;
       return qint;
   }
 

Почему они читают разное количество байтов?
Хотя сколько точно читает readSingle() я не замерил, но точно не по четыре байта.
Записан
romank
Гость
« Ответ #5 : Апрель 19, 2011, 13:19 »

Проверил. in >> (float) читает 8 байт.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Апрель 19, 2011, 13:22 »

На сколько я помню, размер float зависит от платформы. Так же как и int.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
romank
Гость
« Ответ #7 : Апрель 19, 2011, 13:28 »

Вопрос тогда не к float, а к DataStream.
Если sizeof(float) = 4, почему in >> (float) читает 8, и как прочесть 4.
Записан
romank
Гость
« Ответ #8 : Апрель 19, 2011, 13:30 »

А вот и ответ:

void QDataStream::setFloatingPointPrecision ( FloatingPointPrecision precision )
The default is DoublePrecision.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Апрель 19, 2011, 13:33 »

А, точно, я когда-то на такое тоже напоролся. Улыбающийся
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Sancho_s_rancho
Гость
« Ответ #10 : Апрель 19, 2011, 13:44 »

Я тоже вставлю свои 5 копеек.
Люби и знай свой язык. Понимание приходит через фтыкание в строчки стандарта ISO С++. Все иное от лукавого.
Согласно IEEE 754 (IEC 559) float - 4 байта и double - 8 байт. Но ежели вы прочли предидущее предложение, то знаете, что IEEE 754 (IEC 559) не есть стандарт приплюснутого си. С++ может положить болт на Standard for Floating-Point Arithmetic (IEEE 754). Как жить дальше? Используйте limits : numeric_limits. Кстати там есть такая штука: static const bool is_iec559.
Записан
romank
Гость
« Ответ #11 : Апрель 19, 2011, 13:49 »

Я с трудом понимаю о чем вы. Проблема была в DataStream, который "по умолчанию" кушает float двойного размера.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Апрель 19, 2011, 13:58 »

Я с трудом понимаю о чем вы. Проблема была в DataStream, который "по умолчанию" кушает float двойного размера.
Ну и что тут плохого? Размер данных на диске не обязан совпадать с их размером в памяти
Записан
Sancho_s_rancho
Гость
« Ответ #13 : Апрель 19, 2011, 14:01 »

Я с трудом понимаю о чем вы. Проблема была в DataStream, который "по умолчанию" кушает float двойного размера.
Это ваши слова?
Цитировать
Подскажите как создать float тип размером гарантированно 4 байт на 64 битной машине?
На что вам было сказано, что каким быть float решает компилятор, а не вы. Все остальное пользовательские типы.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

Цитировать
Размер данных на диске не обязан совпадать с их размером в памяти
Это как это  Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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