Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение корректности переменной типа float 
V
    Опции темы
Ares4322
Дата 22.10.2011, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: нет
Всего: 3



Доброго времени суток!
Есть самописная серверная программа. С клиентами этот сервер общается по самописному же бинарному протоколу. Разбор пришедших данных осуществляется самым простым образом - memcpy массива принятых байт в структуру с упакованными полями. Формат протокола подразумевает наличие в пакете данных полей с типом unsigned float. Так как float в языке С должен соответствовать стандарту IEEE, то бывают ситуации, когда приходят некорректные данные и в поле типа float лежат данные, не соответствующие этому формату. Каким образом можно определить, что в переменной типа float данные в битовом виде соответствуют (или не соответствуют) формату  IEEE и с ними можно работать как с переменной типа float?
PM MAIL   Вверх
Estranged
Дата 22.10.2011, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 30.8.2010

Репутация: нет
Всего: 3



Цитата(Ares4322 @  22.10.2011,  16:28 Найти цитируемый пост)
unsigned float

Это как?! smile 

http://steve.hollasch.net/cgindex/coding/ieeefloat.html
http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%...%81%D1%82%D0%B8
http://www.binaryconvert.com/convert_float.html
http://cant.ua.ac.be/old/ieeecc754.html

Проверить, что данные не меньше минимального и не больше максимального числа и не бесконечности.
PM MAIL   Вверх
Ares4322
Дата 23.10.2011, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: нет
Всего: 3



Сорри, ошибся. float. так как определить корректность-то? я знаю, что есть стандарт. может подскажете какие-нибудь способы или библиотеки. найти ссылку на стандарт я и сам могу.
PM MAIL   Вверх
volatile
Дата 24.10.2011, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(Ares4322 @  23.10.2011,  21:21 Найти цитируемый пост)
как определить корректность-то?

Имхо, сама задача не верна.
С примерно таким-же успехом можно задасться вопросом, как определить корректность инта. Да никак!
Флоат правда не инт, у него есть несколько невозможных состояний, но это очень редкие случаи.
Можно поставить вопрос так: как определить невозможную или денормализованную комбинацию во флоате.
Это корректная задача, но не думаю что это то, что вам нужно.

PM MAIL   Вверх
Леопольд
Дата 24.10.2011, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(Ares4322 @  22.10.2011,  16:28 Найти цитируемый пост)
бывают ситуации, когда приходят некорректные данные и в поле типа float лежат данные, не соответствующие этому формату.
Что за ситуации?


Это сообщение отредактировал(а) Леопольд - 24.10.2011, 12:52


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
borisbn
Дата 24.10.2011, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Код

// Возвращает true, если x = NaN или +-Inf
bool check_NaN_Inf( float x )
{
    unsigned int * iX = (unsigned int*)(&x);
    if ( ((*iX) & 0x7F800000) == 0x7F800000 )
    {
        return true;
    }
    return false;
}


Способ варварский, но работает smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Ares4322
Дата 24.10.2011, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: нет
Всего: 3



borisbn,  спасибо, попробую.
Хоть один человек вместо спама дело написал.
PM MAIL   Вверх
bsa
Дата 24.10.2011, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Ares4322 @  24.10.2011,  15:38 Найти цитируемый пост)
Хоть один человек вместо спама дело написал. 

Тебе остальные не спам писали, а пытались объяснить, что эта задача не имеет смысла. Ну отловишь ты 0.0001% возможных ошибок. А дальше что? А если тебе придет вполне штатным образом NaN или Inf? Эта функция обозначит их ошибками. Уж лучше добавь контрольную сумму в пакет - надежность возрастет на несколько порядков. Если структура пакета фиксирована, то остается только логический контроль. Т.е. если тебе приходит текущая координата автомобиля, и на основании предыдущих вычислений ты установил, что скорость равна 20 м/с, то можно предположить, что через секунду координата изменится на 20 м. Если водитель нажал на газ, то она может измениться чуть сильнее. А если въехал в бетонный столб - то не измениться (но в этом случае, координата уже не так важна). Но она не может измениться на 5000 м. А уж тем более, уменьшиться (ну если только он не въехал во встречный камаз, груженый песком).
PM   Вверх
math64
Дата 24.10.2011, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Цитата(borisbn @  24.10.2011,  14:11 Найти цитируемый пост)
Способ варварский, но работает 

в math.h определён макрос isnan() - лучше пользоваться им

PM   Вверх
Ares4322
Дата 24.10.2011, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: нет
Всего: 3



Проблема в том, что в протоколе есть CRC и оно корректно, так как отправитель упаковывает некорректные данные на своей стороне. Поэтому CRC не подойдет. А всякие эвристические методы анализа данных - это всегда куча допущений. Поэтому проще проверить float это или нет. И если нет, то не выдавать ошибку.
math64,  спасибо, посмотрю.
PM MAIL   Вверх
Estranged
Дата 24.10.2011, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 30.8.2010

Репутация: нет
Всего: 3



_fpclass
Если не _FPCLASS_PN или не _FPCLASS_PN, то подозрительное число.
Еще _finite.
PM MAIL   Вверх
bsa
Дата 25.10.2011, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Ares4322 @  24.10.2011,  22:05 Найти цитируемый пост)
отправитель упаковывает некорректные данные на своей стороне

супер. Отправителя поправить нельзя? Может у него какой-то другой формат float? Как выглядят некорректные данные, т.е. как их ты сам отличаешь от корректных?
PM   Вверх
Ares4322
Дата 25.10.2011, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: нет
Всего: 3



Формат float такой-же, как и у меня. Отличает их БД, потому что в запрос, где должен быть float кладется хз что. БД, соответственно, ругается. 
То есть парсер, по сути, у меня сейчас БД. Но это неправильно, хотя и просто. И хотелось бы парсер сделать на серверной стороне.
PM MAIL   Вверх
math64
Дата 25.10.2011, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Если БД нужен нормальный 0, а пришёл какой-то нестандарнтый вариант, можно сделать нормализацию:
Код

float x;
float zero = 0.0;
x = x + zero; // x + 0.0 компилятор может соптимизировать


PM   Вверх
bsa
Дата 25.10.2011, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Ares4322 @  25.10.2011,  11:48 Найти цитируемый пост)
Отличает их БД, потому что в запрос, где должен быть float кладется хз что.

Кем и что кладется?
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1355 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.