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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Решение биквадратного уравнения, не могу найти ошибку 
:(
    Опции темы
Ln78
Дата 10.9.2008, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(vinter @  10.9.2008,  10:32 Найти цитируемый пост)
float eps = 1.0e-612;
и  else  if ( fabs(D) < eps ), а то сравнение у тебя было не верно. 


vinter, 10 в минус шестой - это я у тебя взял. Если в минус 12-й, то непонятен смысл для других значений коэффициентов: для float, например 1+10^-8 = 1, какой смысл городить для этих значений ненужную проверку? С другой стороны, и для 10^-12 я могу взять коэффициенты уравнения, чтобы первый вариант давал верное решение, а второй - неправильное. 
А если ты считаешь, что сравнение у меня записано не так (хотя я так понял, что предлагаемый тобой вариант равносилен тому, что у меня названо вторым), напиши свой и приведи значения коэффициентов, когда он даёт лучшее решение, чем вариант, названный у меня первым.
PM MAIL   Вверх
vinter
Дата 10.9.2008, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(Ln78 @  10.9.2008,  11:25 Найти цитируемый пост)
А если ты считаешь, что сравнение у меня записано не так (хотя я так понял, что предлагаемый тобой вариант равносилен тому, что у меня названо вторым),

нет не равносилен/ D < e не эквивалентно -e < D < e

Цитата(Ln78 @  10.9.2008,  11:25 Найти цитируемый пост)
какой смысл городить для этих значений ненужную проверку

как это ненужную? вот тебе пример из жизни, была у меня задача в ней были некие математические вычисления. И в результате должно было получится много нулей. Вместо них получались числа в -26 степен. Если сравнивать с нулем, то было бы не тру. Хотя реально это ноль.

Цитата(Ln78 @  10.9.2008,  11:25 Найти цитируемый пост)
С другой стороны, и для 10^-12 я могу взять коэффициенты уравнения, чтобы первый вариант давал верное решение, а второй - неправильное. 

Ln78 твои решения частные, я могу 1 поделитьт на max double и взять его эпсилоном, тогда ни одни твои коэффициенты не прокатят. Я не пойму, что ты мне пытаешься доказать.


--------------------
Мой блог
PM MAIL WWW   Вверх
Ln78
Дата 10.9.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



vinter, давай без ненужных философствований - приведи свой вариант, с эпсилонами, и покажи, чем он лучше. 
Цитата(vinter @  10.9.2008,  12:09 Найти цитируемый пост)
твои решения частные

Где ты это увидел? Для каких частных случаев вариант разработан, названный мною вариантом 1, и в чём вариант с эпсилонами более общий? Только приведи решение в виде кода и чисел, а не в виде общих рассуждений.

P.S. про
Цитата(vinter @  10.9.2008,  12:09 Найти цитируемый пост)
нет не равносилен/ D < e не эквивалентно -e < D < e

ты, возможно, не обратил внимание на else  в условии: else  if (D < eps).


Это сообщение отредактировал(а) Ln78 - 10.9.2008, 11:27
PM MAIL   Вверх
sergejzr
Дата 10.9.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Чего вы спорите?
vinter - прав, так как сравнивать вещественные числа в компьютерной программе без "зазора" нельзя!
Ln78 - прав, так как в правильном решении уравнения надо именно сравнивать на 0, а не на "зазор".

Один говорит, что слон большой, а другой - что слон серый smile





--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Mayk
Дата 10.9.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



Цитата(Ln78 @  10.9.2008,  15:24 Найти цитируемый пост)

Где ты это увидел? Для каких частных случаев вариант разработан, названный мною вариантом 1, и в чём вариант с эпсилонами более общий? Только приведи решение в виде кода и чисел, а не в виде общих рассуждений.


Код

#include <stdio.h>
#include <math.h>

// mult*(x-delta)**2 = mult*(x**2-2*delta*x+delta*delta) 

int main()
{
     float A, B, C, x[2] = {0};
    float mult =5;
    float delta=3.333333;
      int N;
    A=mult;
    B=mult*(delta+delta);
    C=mult*delta*delta;
            
      float D = B*B - 4*A*C;
      char Buffer[120];
      float eps = 1.0e-6;
// 1-й вариант
    printf("%.13f\n", D);
      if (D<0)
      {
         N = 0;
         sprintf(Buffer, "Нет действительных корней" );
      }
      else  if (D==0)
      {
         x[0] = -B/(2*A);
         sprintf(Buffer, "Один действительный корень %.3g кратности 2", x[0] );
         N = 1;
      }
      else
      {
         x[0] = (-B+sqrt(D))/(2*A);
         x[1] = (-B-sqrt(D))/(2*A);
         sprintf(Buffer, "Два действительных корня %.3g и %.3g", x[0], x[1] );
         N = 2;
      }
printf("%s\n", Buffer);
}

Цитата

-0.0001441107597
Нет действительных корней

Очевидно что вариант с эпсилонам тоже облажаеца. Так как подбирать коефициенты в лом, то делаем ход конём - меняем float на double.
Код

#include <stdio.h>
#include <math.h>

// mult*(x-delta)**2 = mult*(x**2-2*delta*x+delta*delta) 

int main()
{
     double A, B, C, x[2] = {0};
    double mult =5;
    double delta=3.333333;
      int N;
    A=mult;
    B=mult*(delta+delta);
    C=mult*delta*delta;
            
      double D = B*B - 4*A*C;
      char Buffer[120];
      double eps = 1.0e-6;
// 1-й вариант
    printf("%.13f\n", D);
      if (D<0)
      {
         N = 0;
         sprintf(Buffer, "Нет действительных корней" );
      }
      else  if (D==0)
      {
         x[0] = -B/(2*A);
         sprintf(Buffer, "Один действительный корень %.3g кратности 2", x[0] );
         N = 1;
      }
      else
      {
         x[0] = (-B+sqrt(D))/(2*A);
         x[1] = (-B-sqrt(D))/(2*A);
         sprintf(Buffer, "Два действительных корня %.3g и %.3g", x[0], x[1] );
         N = 2;
      }
printf("%s\n", Buffer);
}

Цитата

0.0000000000002
Два действительных корня -3.33 и -3.33

Лажа дедекдет. Эпсилон здесь отработает нормально. Так как это очевидно то код писать не буду.

Это сообщение отредактировал(а) Mayk - 10.9.2008, 11:50


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
vinter
Дата 10.9.2008, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(Ln78 @  10.9.2008,  12:24 Найти цитируемый пост)
приведи свой вариант, с эпсилонами, и покажи, чем он лучше. 

сходу пример не приведу, для этого нужны вычисления, а не константные числа.
Цитата(Ln78 @  10.9.2008,  12:24 Найти цитируемый пост)
ты, возможно, не обратил внимание на else  в условии: else  if (D < eps).

-1 < eps? но нельзя сказать что -1 равна нулю.


--------------------
Мой блог
PM MAIL WWW   Вверх
Ln78
Дата 10.9.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(sergejzr @  10.9.2008,  12:44 Найти цитируемый пост)
Чего вы спорите?
vinter - прав, так как сравнивать вещественные числа в компьютерной программе без "зазора" нельзя!
Ln78 - прав, так как в правильном решении уравнения надо именно сравнивать на 0, а не на "зазор".

sergejzr, мы спорим о конкретном вопросе - имеет ли смысл писать эпсилон при решении квадратных уравнений. Не об абстрактном сравнении вещественных чисел вообще. Если говорить вообще, то сравнивать можно и так, и сяк, и наперекосяк, нужно только понимать, что это может за собой повлечь и как в каждой конкретной ситуации лучше делать. Для студента, чтобы решить его задачу, если он взялся учитывать машинную погрешность, тем самым как бы заявил, что не просто так бездумно запрограммировал формулы, а претендует на большее, нужно или писать намного более громоздко, учитывая и возможные переполнения при делении и прочее (при этом непонятно, почему используется float, а не long double), или не заморачиваться на эту тему вообще. Мне так кажется, что более простой вариант может быть засчитан как правильное решение.

Mayk, попытка хорошая. Однако у меня твоих результатов не было: в первом случае (float) оба варианта одинаково наврали, что корней нет. С типом double первый вариант выдал (если увеличить точность выдачи до 13 знаков после запятой), что имеются 2 действительных корня -3.333332952316 и -3.333333047684, второй честно сказал, что один действительный корень -3.333333 кратности 2. 
Учитывая даже такой "грех" первого варианта, если говорить о различных вариантах коэффициентов, в том числе и подобных тому, что я приводил, ты бы какой из вариантов посчитал лучшим? И, кстати, совершенно непонятно, что у тебя выдалось, ты ничего не напутал? Я смотрел на VS2005, процессор обычный интелловский, а ты где?

Отредактировано. - я не посмотрел, что ты выдавал только для первого варианта, дополнив выдачей дискриминанта. Этот вопрос снимаю. Вопрос про лучший вариант остаётся.

Цитата(vinter @  10.9.2008,  12:49 Найти цитируемый пост)
-1 < eps? но нельзя сказать что -1 равна нулю. 

vinter, посмотри внимательнее мой пример. Обрати внимание на самый первый if и учти, что  -1<-eps.


Это сообщение отредактировал(а) Ln78 - 10.9.2008, 12:50
PM MAIL   Вверх
vinter
Дата 10.9.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(Ln78 @  10.9.2008,  13:44 Найти цитируемый пост)
мы спорим о конкретном вопросе - имеет ли смысл писать эпсилон при решении квадратных уравнений.


Ln78, мы спорим о сранении вещественных чисел в целом, а не в данном конкретном случае.


--------------------
Мой блог
PM MAIL WWW   Вверх
Ln78
Дата 10.9.2008, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(vinter @  10.9.2008,  13:49 Найти цитируемый пост)
Ln78, мы спорим о сранении вещественных чисел в целом, а не в данном конкретном случае. 

Ничего подобного smile . Перечитай мой первый пост:
Цитата(Ln78 @  9.9.2008,  21:12 Найти цитируемый пост)
Как раз эти форматы и определяют, что в данной ситуации прав NoliX, и число 10^-6, и даже 10^-26 - положительные

обрати внимание на слова "в данной ситуации". 
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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