![]() |
|
Модераторы: bsa |
![]()
|
|
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 1 Всего: 128 |
vinter, ага, очепяток
|
|||
|
||||
| NoliX |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 5.7.2005 Репутация: 1 Всего: 1 |
По-моему в данной задаче это не уместно, тут идет сравнение только с нулем, для определения положительности или отрицательности никакие малые величины не нужны, если же требуется установить, что переменная равна нулю, то в данной задаче необходимо полное совпадение перемнной с нулем, тоесть '==', если мы будем смотреть, попадает ли одно число в окрестность заданного радиуса другого, то потеряем точность и вместо 2-х различных по модулю корней получим один мое видение задачи:
код не тестил (у меня студия), могут быть косяки, но логика должна быть понятна Это сообщение отредактировал(а) NoliX - 8.9.2008, 17:23 --------------------
Опыт - это учитель, который очень дорого берет за свои уроки |
||||
|
|||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
||||
|
||||
| NoliX |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 5.7.2005 Репутация: 1 Всего: 1 |
это число положительно, имеет знак + => оно больше нуля
тем, что Вы оцениваете модуль разности какм-то эпсилон Вы только увеличиваете погрешность сравнения со стандартной Борландовской до Вашей 0.000001 Хотя может я чего-то не догоняю, конечно, но если у двух чивел различие в 30-м знаке после запятой, то в тип float он не влезет и такие числа будут равны, так как n знаков просто обрежутся, если сравнивать через оценку, то по Вашему числа 0.0000005 и 0.0000006 равны Это сообщение отредактировал(а) NoliX - 8.9.2008, 20:37 --------------------
Опыт - это учитель, который очень дорого берет за свои уроки |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
почитай про форматы чисел с плавающей запятой, абсолютное значение числа, которое можно хранить в переменной типа float ограничен как сверху, так и снизу |
|||
|
||||
| NoliX |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 5.7.2005 Репутация: 1 Всего: 1 |
Да я знаю, вот и вводя эпсилон мы искусственно ухудшаем ситуацию, я не знаю как еще объяснить? единственное чего я не знаю, это какое самое маленькое число может храниться во float Кстати я не против такого метода, я, просто, говорю, что тут не нужно мудрить, если число не равно нулю (а это ведь дискриминант) и с положительным знаком, то оно нам подходит Сравнение двух, черти каких чисел, очевидно, нужно производить оценкой модуля разности Это сообщение отредактировал(а) NoliX - 8.9.2008, 21:00 --------------------
Опыт - это учитель, который очень дорого берет за свои уроки |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
с чего такой вывод, так может храниться и ноль ;) P.S давай на ты, не люблю когда Выкают |
|||
|
||||
| NoliX |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 5.7.2005 Репутация: 1 Всего: 1 |
Это профессиональная привычка, у нас тут так принято) В общем ладно, скорее всего оно так и есть Про сравнение двух чисел я знаю, а вот с нулем, мне казалось, что все проще --------------------
Опыт - это учитель, который очень дорого берет за свои уроки |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
мм, у нас тут так не принято |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Можно определить диапазон чисел, в котором будет работать алгоритм и использовать только целые. (из 0.001 делать 0.001*1000=1) |
|||
|
||||
| Ln78 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: нет Всего: 15 |
Как раз эти форматы и определяют, что в данной ситуации прав NoliX, и число 10^-6, и даже 10^-26 - положительные. И уж точно ничего не улучшится от введения дополнительной искуственной погрешности в данном случае. И сравнение с нулём именно такое (==0) в данном случае наиболее разумно. Вещественное число такое же устойчивое, как и целое в том смысле, что его разряды от ветра и температуры процессора не зависят. И даже в тех случаях, когда нужно учитывать погрешность при сравнении, важно не забывать, что это числа с плавающей, а не фиксированной запятой. Поэтому просто 10^-6 безотносительно остальных параметров (коэффициенты уравнения порядка 1; 10^10; 10^-10), как правило, не является лучшим решением. |
||||
|
|||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
||||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
если число ввели с клавиатуры, то оно вполне может быть точно равно 0, если же число получено в вычислениях, то там чаще всего будет 10^(-много), так что вот так...
|
|||
|
||||
| Ln78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: нет Всего: 15 |
vinter, заявление категоричное по сути и хамоватое по форме. Учитывая формулировки вида матчасть хорошо бы подтянуть тебе, чтобы отличать бесконечно малый эпсилон от машинного эпсилона. Чтобы обсуждение было предметным, посмотри на пример:
При указанных мною коэффициентах очевидно второй вариант - ошибочный. Приведи такие значения коэффициентов квадратного уравнения, когда второй вариант лучше. Это сообщение отредактировал(а) Ln78 - 10.9.2008, 07:03 |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
извини, не хотел обидеть Ln78, хитрый какой float eps = 1.0e-612; и else if ( fabs(D) < eps ), а то сравнение у тебя было не верно. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |