![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: нет Всего: 3 |
Доброго времени суток!
Есть самописная серверная программа. С клиентами этот сервер общается по самописному же бинарному протоколу. Разбор пришедших данных осуществляется самым простым образом - memcpy массива принятых байт в структуру с упакованными полями. Формат протокола подразумевает наличие в пакете данных полей с типом unsigned float. Так как float в языке С должен соответствовать стандарту IEEE, то бывают ситуации, когда приходят некорректные данные и в поле типа float лежат данные, не соответствующие этому формату. Каким образом можно определить, что в переменной типа float данные в битовом виде соответствуют (или не соответствуют) формату IEEE и с ними можно работать как с переменной типа float? |
|||
|
||||
Estranged |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 30.8.2010 Репутация: нет Всего: 3 |
Это как?! ![]() 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 Проверить, что данные не меньше минимального и не больше максимального числа и не бесконечности. |
|||
|
||||
Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: нет Всего: 3 |
Сорри, ошибся. float. так как определить корректность-то? я знаю, что есть стандарт. может подскажете какие-нибудь способы или библиотеки. найти ссылку на стандарт я и сам могу.
|
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Имхо, сама задача не верна. С примерно таким-же успехом можно задасться вопросом, как определить корректность инта. Да никак! Флоат правда не инт, у него есть несколько невозможных состояний, но это очень редкие случаи. Можно поставить вопрос так: как определить невозможную или денормализованную комбинацию во флоате. Это корректная задача, но не думаю что это то, что вам нужно. |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Это сообщение отредактировал(а) Леопольд - 24.10.2011, 12:52 -------------------- вопросов больше чем ответов |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Способ варварский, но работает ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: нет Всего: 3 |
borisbn, спасибо, попробую.
Хоть один человек вместо спама дело написал. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Тебе остальные не спам писали, а пытались объяснить, что эта задача не имеет смысла. Ну отловишь ты 0.0001% возможных ошибок. А дальше что? А если тебе придет вполне штатным образом NaN или Inf? Эта функция обозначит их ошибками. Уж лучше добавь контрольную сумму в пакет - надежность возрастет на несколько порядков. Если структура пакета фиксирована, то остается только логический контроль. Т.е. если тебе приходит текущая координата автомобиля, и на основании предыдущих вычислений ты установил, что скорость равна 20 м/с, то можно предположить, что через секунду координата изменится на 20 м. Если водитель нажал на газ, то она может измениться чуть сильнее. А если въехал в бетонный столб - то не измениться (но в этом случае, координата уже не так важна). Но она не может измениться на 5000 м. А уж тем более, уменьшиться (ну если только он не въехал во встречный камаз, груженый песком). |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
||||
|
||||
Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: нет Всего: 3 |
Проблема в том, что в протоколе есть CRC и оно корректно, так как отправитель упаковывает некорректные данные на своей стороне. Поэтому CRC не подойдет. А всякие эвристические методы анализа данных - это всегда куча допущений. Поэтому проще проверить float это или нет. И если нет, то не выдавать ошибку.
math64, спасибо, посмотрю. |
|||
|
||||
Estranged |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 30.8.2010 Репутация: нет Всего: 3 |
||||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
супер. Отправителя поправить нельзя? Может у него какой-то другой формат float? Как выглядят некорректные данные, т.е. как их ты сам отличаешь от корректных? |
|||
|
||||
Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: нет Всего: 3 |
Формат float такой-же, как и у меня. Отличает их БД, потому что в запрос, где должен быть float кладется хз что. БД, соответственно, ругается.
То есть парсер, по сути, у меня сейчас БД. Но это неправильно, хотя и просто. И хотелось бы парсер сделать на серверной стороне. |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Если БД нужен нормальный 0, а пришёл какой-то нестандарнтый вариант, можно сделать нормализацию:
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
||||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: нет Всего: 3 |
xvr, данные передаются в запрос именно в текстовом виде. float - это тип поля в БД
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
ну так не морочьте людям голову, так и скажите: БД не нравится, когда Вы ей даете значение поля типа float в виде строки 'nan' или 'inf'. Проверяйте при помощи isinf() и isnan(), как Вам посоветовал math64 Добавлено через 1 минуту согласитесь, это совсем про другое вопрос ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |