Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Veras
0 / 0 / 0
Регистрация: 06.11.2012
Сообщений: 10
1

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

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

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

Как программно различать число целое и с плавающей точкой
Привет :) Недавно решал задачу и там нужно было находить корни элементов...

Конструирование значения целого числа или числа с плавающей точкой по его дампу
Как сконструировать значения целого числа(char, short int, long int) или числа...

Точность числа с плавающей точкой
У типа float числа одинарной точности с плавающей запятой обеспечивают...

Усечение числа с плавающей точкой
Доброго времени суток! Собсно сабж. floor(v*1000)/1000 не помогает,...

Округлить числа с плавающей точкой
Подскажите почему работает неправильно! Не округляет, а выдает только числа до...

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

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

Так что извините. Без ограничений на float вы не сможете разделить всё множество значений в обеих интерпретациях даже на три класса: "точно float", "точно short", "не знаю".
0
zer0mail
2452 / 2089 / 216
Регистрация: 03.07.2012
Сообщений: 7,570
Записей в блоге: 1
01.10.2013, 10:15 10
И все же надежда есть, имхо
Если исходный файл сформирован по алгоритму: короткие пишем как целые, а большие как float, то скорей всего конфликтов с ненормализованным float не будет.
0
01.10.2013, 10:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2013, 10:15

Вывод числа с плавающей точкой
Доброго всем времени суток. Пытаюсь вывести число с плавающей запятой на LCD....

Числа с плавающей точкой после деления
Помогите, какая тут ошибка? мне нужно чтобы вышло числа с плавающей точкой...

Неправильный вывод числа с плавающей точкой
Здравствуйте. Почему когда я ввожу число с плавающей точкой, например,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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