![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
в коде встречается такая строчка и dist получается отрицательным числом, я так предполагаю, что происходит переполнение из-за того что в sqrt слишком большое число? как этого можно сдетектировать или избежать? |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
сначала результат присвоить переменной типа double, затем проверить на [0;INT_MAX] и уже после только присваивать целочисленной переменной.
|
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
ну так dist будет отрицательным же(т.е. достаточно проверить на <0), т.к. будет больше INT_MAX(или при преобразовании в дабл что измениться?). а если число 2 раза выйдет за пределы и снова станет положительным? (или такого не может быть?) |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
||||
|
||||
| volatile |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Может быть что угодно. Если не ошибаюсь, приведение непомещающегося дабл к инт, это UB.
точнее так
ну и на нижнюю границу тоже, не помешает проверить. а чтоб не изобретать велосипед, смотрите boost::numeric_cast<> |
||||||
|
|||||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
isfinite только в c++11 ? как же раньше без этого жили?
и я не понял метод проверить int на переполнение это положить его в double и проверить на выход за границы int? а для double есть своя функция isfinite ? почему её тогда и для int нету? Это сообщение отредактировал(а) mrgloom - 24.5.2013, 08:46 |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
потому что в представлении чисел с плавающей запятой есть такое специальное значение, а все числа int правильные (по значению невозможно определить, было ли переполнение). в С/С++ нет средств проверки переполнения целочисленных арифметических операций, хотя процессор имеет такие средства (CF, OF). можно выполнить проверку x==x, если x - NaN, должно быть false фанаты могут опереться на стандарт и проверять биты |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |