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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Veras
0 / 0 / 0
Регистрация: 06.11.2012
Сообщений: 10
#1

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

30.09.2013, 17:56. Просмотров 616. Ответов 9
Метки нет (Все метки)

Есть следующий union:
C++
1
2
3
4
5
union
{
    int i;
    float f;
} i_f;
Как можно определить, какие данные в настоящий момент находятся в union (целое число или с плавающей точкой), если известно, что целое может быть только в диапазоне -32768..32767 (т.е. по сути short)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2013, 17:56     Отличить целое от числа с плавающей точкой в 32-разрядном регистре
Посмотрите здесь:

Усечение числа с плавающей точкой C++
Точность числа с плавающей точкой C++
C++ Как программно различать число целое и с плавающей точкой
Как получить дробную часть числа с плавающей точкой? C++
Перевод из десятичной системы счисления в двоичную числа с плавающей точкой C++
C++ Ifstream считать из файла числа с плавающей точкой
C++ Неправильный вывод числа с плавающей точкой
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.09.2013, 18:18     Отличить целое от числа с плавающей точкой в 32-разрядном регистре #2
Veras, читаем как целое, если получаем вне диапазона, то точно float. Иначе, возможны варианты.
zer0mail
2321 / 1947 / 192
Регистрация: 03.07.2012
Сообщений: 6,970
Записей в блоге: 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
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.09.2013, 22:02     Отличить целое от числа с плавающей точкой в 32-разрядном регистре #5
Цитата Сообщение от Veras Посмотреть сообщение
Но ведь числа в диапазоне -32768..32767 (их битовое представление в 32-разрядном регистре) могут быть и корректными значениями float, или нет?
Самый простой способ: записать как целое и вывести как float в цикле по всему диапазону.
Способ посложнее: обратиться к стандарту ieee754.
zer0mail
2321 / 1947 / 192
Регистрация: 03.07.2012
Сообщений: 6,970
Записей в блоге: 1
30.09.2013, 22:21     Отличить целое от числа с плавающей точкой в 32-разрядном регистре #6
Имно, это должна быть проблема того, кто пишет данные (он-то знает, float или int).
Добавить в структуру флаг isFloat и не париться
Tulosba
:)
Эксперт С++
4391 / 3234 / 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
~ Эврика! ~
1243 / 992 / 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++ Вывод числа с плавающей точкой
Выделить подстроку представляющую запись вещественного числа с плавающей точкой C++
Перевод числа с плавающей точкой из шестнадцатиричного в двоичный вид C++

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru