Форум программистов, компьютерный форум CyberForum.ru

Отличить целое от числа с плавающей точкой в 32-разрядном регистре - C++

Восстановить пароль Регистрация
 
Veras
0 / 0 / 0
Регистрация: 06.11.2012
Сообщений: 10
30.09.2013, 17:56     Отличить целое от числа с плавающей точкой в 32-разрядном регистре #1
Есть следующий union:
C++
1
2
3
4
5
union
{
    int i;
    float f;
} i_f;
Как можно определить, какие данные в настоящий момент находятся в union (целое число или с плавающей точкой), если известно, что целое может быть только в диапазоне -32768..32767 (т.е. по сути short)?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.09.2013, 18:18     Отличить целое от числа с плавающей точкой в 32-разрядном регистре #2
Veras, читаем как целое, если получаем вне диапазона, то точно float. Иначе, возможны варианты.
zer0mail
2185 / 1868 / 187
Регистрация: 03.07.2012
Сообщений: 6,645
Записей в блоге: 1
30.09.2013, 18:20     Отличить целое от числа с плавающей точкой в 32-разрядном регистре #3
А зачем надо отличать?
Veras
0 / 0 / 0
Регистрация: 06.11.2012
Сообщений: 10
30.09.2013, 21:00  [ТС]     Отличить целое от числа с плавающей точкой в 32-разрядном регистре #4
Цитата Сообщение от zer0mail Посмотреть сообщение
А зачем надо отличать?
Данные в итоге нужно преобразовать в float, а если float интерпретировать как int, получаются некорректные числа...
Цитата Сообщение от Tulosba Посмотреть сообщение
Veras, читаем как целое, если получаем вне диапазона, то точно float. Иначе, возможны варианты.
Но ведь числа в диапазоне -32768..32767 (их битовое представление в 32-разрядном регистре) могут быть и корректными значениями float, или нет?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.09.2013, 22:02     Отличить целое от числа с плавающей точкой в 32-разрядном регистре #5
Цитата Сообщение от Veras Посмотреть сообщение
Но ведь числа в диапазоне -32768..32767 (их битовое представление в 32-разрядном регистре) могут быть и корректными значениями float, или нет?
Самый простой способ: записать как целое и вывести как float в цикле по всему диапазону.
Способ посложнее: обратиться к стандарту ieee754.
zer0mail
2185 / 1868 / 187
Регистрация: 03.07.2012
Сообщений: 6,645
Записей в блоге: 1
30.09.2013, 22:21     Отличить целое от числа с плавающей точкой в 32-разрядном регистре #6
Имно, это должна быть проблема того, кто пишет данные (он-то знает, float или int).
Добавить в структуру флаг isFloat и не париться
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.09.2013, 22:26     Отличить целое от числа с плавающей точкой в 32-разрядном регистре #7
Цитата Сообщение от zer0mail Посмотреть сообщение
Добавить в структуру флаг isFloat и не париться
C++
1
2
3
4
5
6
union
{
    int i;
    float f;
    bool isfloat;
} i_f;
Veras
0 / 0 / 0
Регистрация: 06.11.2012
Сообщений: 10
30.09.2013, 22:46  [ТС]     Отличить целое от числа с плавающей точкой в 32-разрядном регистре #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Способ посложнее: обратиться к стандарту ieee754.
Ну я надеялся, что кто-нибудь им хорошо владеет и сходу подскажет, как это проще сделать
Цитата Сообщение от Tulosba Посмотреть сообщение
Самый простой способ: записать как целое и вывести как float в цикле по всему диапазону.
Спасибо за наводку. Проверил - для диапазона -32768..-1 выдает -1.#QNAN0, для диапазона 0..32767 выдает 0, т.е. вроде бы корректных данных типа float с такими значениями битов быть не может.

Цитата Сообщение от zer0mail Посмотреть сообщение
Имно, это должна быть проблема того, кто пишет данные (он-то знает, float или int).
Полностью согласен, но туда доступа нет
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.10.2013, 01:21     Отличить целое от числа с плавающей точкой в 32-разрядном регистре #9
Цитата Сообщение от Veras Посмотреть сообщение
для диапазона 0..32767 выдает 0, т.е. вроде бы корректных данных типа float с такими значениями битов быть не может
Может, ещё как может. У IEEE 754 float нет запрещённых значений. Младшие 16 битов float, куда записывается ваш short int, — это кусочек мантиссы. Если знаковый бит нулевой и все биты экспоненты нулевые (а это так, если во float записаты биты положительного short int), то такой float обозначает ноль (положительный) или денормализованное число.

Так что извините. Без ограничений на float вы не сможете разделить всё множество значений в обеих интерпретациях даже на три класса: "точно float", "точно short", "не знаю".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2013, 10:15     Отличить целое от числа с плавающей точкой в 32-разрядном регистре
Еще ссылки по теме:

перевод из десятичной системы счисления в двоичную числа с плавающей точкой C++
C++ Выделить подстроку, которая соответствует записи вещественного числа с плавающей точкой
C++ Ifstream считать из файла числа с плавающей точкой

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
zer0mail
2185 / 1868 / 187
Регистрация: 03.07.2012
Сообщений: 6,645
Записей в блоге: 1
01.10.2013, 10:15     Отличить целое от числа с плавающей точкой в 32-разрядном регистре #10
И все же надежда есть, имхо
Если исходный файл сформирован по алгоритму: короткие пишем как целые, а большие как float, то скорей всего конфликтов с ненормализованным float не будет.
Yandex
Объявления
01.10.2013, 10:15     Отличить целое от числа с плавающей точкой в 32-разрядном регистре
Ответ Создать тему
Опции темы

Текущее время: 21:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru