![]() |
|
Модераторы: bsa |
![]()
|
|
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 1 Всего: 128 |
Ерунда какая-то получается. Решаю биквадратное уравнение. Алгоритм продумал, он несложный, написал программу, но уперся в совершенно непонятную для меня ошибку. Компилятор Borland C++ 3.1, который я ненавижу, а что делать, в универе только его принимают.
Так. Запутался совсем с проверкой на ноль дробных чисел в Си. Привожу свое полное решение задачи, но оно не работает, сразу говорю, не проходят условия на проверку >, < или = 0. Чтоб эти дробные числа провалились уже. Помогите с этими условиями, остальное я сам доработаю.
ЗЫ попутно еще вопрос... Логический тип в Си - bool ? А почему тогда Borland C++ его не понимает? И еще, если я написал какие-нить глупости в коде, прошу поправить... Это сообщение отредактировал(а) mr.Anderson - 7.9.2008, 10:30 |
|||
|
||||
| vinter |
|
||||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
канеш бред
тут я не понял о чем ты |
||||||
|
|||||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 1 Всего: 128 |
vinter, отредактировал. Ведь коэффициенты могут быть и дробными. С целыми-то все легко и просто. А вот с дробными как?
|
|||
|
||||
| anatox91 |
|
|||
![]() программист-самоучка ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 12.1.2008 Где: ++Украина.Крым++ Репутация: 1 Всего: 13 |
bool появился только в С++ (ну еще может быть в каких-то более поздних версиях Си) -------------------- The code is the design © Sony VAIO VGN-FW480J ![]() |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
зачем fabs вызывать для аргумента типа int?
|
|||
|
||||
| Hades |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 226 Регистрация: 8.8.2008 Репутация: нет Всего: 37 |
||||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
дробные так не проверяются. Дробные надо сверять по какой-то бесконечно малой епсилон. Допустим тебе надо сравнить две переменные типа float\double => |a - b| < e, где e допустим 0.000001 |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 1 Всего: 128 |
anatox91, бред какой-то. Куда ж без логики-то? И что вместо него использовать?
Lazin, угу, забыл объявление поправить. Но суть не в этом. vinter, это я понял, а как проверить > < нуля? На равенство уже понятно. Hades, спасибо, хотя Си и С++ ненавижу, а среду эту вообще глаза б не видели. А что делать. Добавлено через 4 минуты и 36 секунд Да, кстати, и что делает fabs()? Слова "возвращает абсолютное значение аргумента" мне мало о чем говорят... Это сообщение отредактировал(а) mr.Anderson - 7.9.2008, 10:28 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Возвращает модуль числа с плавающей точкой -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
||||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 1 Всего: 128 |
Alexeis, vinter, спасибо, теперь въехал...
Попробую с эпсилонами этими сейчас. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
вот оно тебе и платит тем-же |
|||
|
||||
| Ln78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: нет Всего: 15 |
||||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 1 Всего: 128 |
Усе получилось.
Так что, я думаю, это полное решение биквадратного уравнения.
Добавлено @ 13:20 Lazin, Ln78, угу. Это сообщение отредактировал(а) mr.Anderson - 7.9.2008, 13:40 |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
||||
|
||||
| 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 ), а то сравнение у тебя было не верно. |
|||
|
||||
| Ln78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: нет Всего: 15 |
vinter, 10 в минус шестой - это я у тебя взял. Если в минус 12-й, то непонятен смысл для других значений коэффициентов: для float, например 1+10^-8 = 1, какой смысл городить для этих значений ненужную проверку? С другой стороны, и для 10^-12 я могу взять коэффициенты уравнения, чтобы первый вариант давал верное решение, а второй - неправильное. А если ты считаешь, что сравнение у меня записано не так (хотя я так понял, что предлагаемый тобой вариант равносилен тому, что у меня названо вторым), напиши свой и приведи значения коэффициентов, когда он даёт лучшее решение, чем вариант, названный у меня первым. |
|||
|
||||
| vinter |
|
||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
нет не равносилен/ D < e не эквивалентно -e < D < e как это ненужную? вот тебе пример из жизни, была у меня задача в ней были некие математические вычисления. И в результате должно было получится много нулей. Вместо них получались числа в -26 степен. Если сравнивать с нулем, то было бы не тру. Хотя реально это ноль.
Ln78 твои решения частные, я могу 1 поделитьт на max double и взять его эпсилоном, тогда ни одни твои коэффициенты не прокатят. Я не пойму, что ты мне пытаешься доказать. |
||||
|
|||||
| Ln78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: нет Всего: 15 |
vinter, давай без ненужных философствований - приведи свой вариант, с эпсилонами, и покажи, чем он лучше.
Где ты это увидел? Для каких частных случаев вариант разработан, названный мною вариантом 1, и в чём вариант с эпсилонами более общий? Только приведи решение в виде кода и чисел, а не в виде общих рассуждений. P.S. про ты, возможно, не обратил внимание на else в условии: else if (D < eps). Это сообщение отредактировал(а) Ln78 - 10.9.2008, 11:27 |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Чего вы спорите?
vinter - прав, так как сравнивать вещественные числа в компьютерной программе без "зазора" нельзя! Ln78 - прав, так как в правильном решении уравнения надо именно сравнивать на 0, а не на "зазор". Один говорит, что слон большой, а другой - что слон серый |
|||
|
||||
| Mayk |
|
||||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 3 Всего: 134 |
Очевидно что вариант с эпсилонам тоже облажаеца. Так как подбирать коефициенты в лом, то делаем ход конём - меняем float на double.
Лажа дедекдет. Эпсилон здесь отработает нормально. Так как это очевидно то код писать не буду. Это сообщение отредактировал(а) Mayk - 10.9.2008, 11:50 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||||
|
|||||||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
||||
|
||||
| Ln78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: нет Всего: 15 |
sergejzr, мы спорим о конкретном вопросе - имеет ли смысл писать эпсилон при решении квадратных уравнений. Не об абстрактном сравнении вещественных чисел вообще. Если говорить вообще, то сравнивать можно и так, и сяк, и наперекосяк, нужно только понимать, что это может за собой повлечь и как в каждой конкретной ситуации лучше делать. Для студента, чтобы решить его задачу, если он взялся учитывать машинную погрешность, тем самым как бы заявил, что не просто так бездумно запрограммировал формулы, а претендует на большее, нужно или писать намного более громоздко, учитывая и возможные переполнения при делении и прочее (при этом непонятно, почему используется float, а не long double), или не заморачиваться на эту тему вообще. Мне так кажется, что более простой вариант может быть засчитан как правильное решение. Mayk, попытка хорошая. Однако у меня твоих результатов не было: в первом случае (float) оба варианта одинаково наврали, что корней нет. С типом double первый вариант выдал (если увеличить точность выдачи до 13 знаков после запятой), что имеются 2 действительных корня -3.333332952316 и -3.333333047684, второй честно сказал, что один действительный корень -3.333333 кратности 2. Учитывая даже такой "грех" первого варианта, если говорить о различных вариантах коэффициентов, в том числе и подобных тому, что я приводил, ты бы какой из вариантов посчитал лучшим? И, кстати, совершенно непонятно, что у тебя выдалось, ты ничего не напутал? Я смотрел на VS2005, процессор обычный интелловский, а ты где? Отредактировано. - я не посмотрел, что ты выдавал только для первого варианта, дополнив выдачей дискриминанта. Этот вопрос снимаю. Вопрос про лучший вариант остаётся. vinter, посмотри внимательнее мой пример. Обрати внимание на самый первый if и учти, что -1<-eps. Это сообщение отредактировал(а) Ln78 - 10.9.2008, 12:50 |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
||||
|
||||
| Ln78 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: нет Всего: 15 |
Ничего подобного
обрати внимание на слова "в данной ситуации". |
||||
|
|||||
![]()
|
| Правила форума "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. |