Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2013, 13:14   #1
Oban
Пользователь
 
Регистрация: 07.04.2013
Сообщений: 10
Вопрос проблема с расчетом функции

вообщем такая проблема не существует десятичный логарифм на промежутке от 0 до 1, хотя должен не могу понять почему
Код:
iter=0;
for(x=xn; x<=xk; x=x+h)
{
 if (x!=0)
        {
  if (abs(x-0.8)>t)
  {
   if ((log10(abs(x-0.8))+exp(x))>t)
   {
     if (sin(x)!=0)
     {
       if ((exp(-x)-(cos(x)/sin(x)))!=0)
       {

         y[i]=(sqrt(log10(abs(x-0.8))+exp(x)))/(exp(-x)-(cos(x)/sin(x)))+pow(exp(5)-1/x,1/3);
         yi=y[i];
        }
       else (ShowMessage("Деление на 0")); }
      else (ShowMessage("Ctg не существует")); }
     else (ShowMessage("под корнем меньше 0")); }
    else (ShowMessage("log не существует")); }
   else (ShowMessage("Деление на 0"));

 SGD1->Cells[0][iter+1]=FormatFloat("0.###",x);
 SGD1->Cells[1][iter+1]=FormatFloat("0.######",y[i]);
 iter++;
 i++;
 SGD1->RowCount=iter+1;
}
модуль ведь всегда будет положительным и основание 10...
Oban вне форума Ответить с цитированием
Старый 07.04.2013, 13:23   #2
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Используй fabs

Последний раз редактировалось FataLL; 07.04.2013 в 13:27.
FataLL вне форума Ответить с цитированием
Старый 07.04.2013, 13:32   #3
Oban
Пользователь
 
Регистрация: 07.04.2013
Сообщений: 10
По умолчанию

спасибо! все норм считать начало...
после паскаля перешел на билдер еще не вникнул в детали)
Oban вне форума Ответить с цитированием
Старый 07.04.2013, 13:50   #4
Oban
Пользователь
 
Регистрация: 07.04.2013
Сообщений: 10
По умолчанию

хм еще 1 ошибка пример ввожу от -5 до 5 с шагом 1 все норм на 0 выдает "деление на 0"
но ввожу дробный шаг например 0.4 и он уже пропускает почему то этот момент, и на 0 значение функции = 1
Oban вне форума Ответить с цитированием
Старый 07.04.2013, 17:19   #5
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Когда от -5 до 5 с шагом 1, то когда x становится 0, срабатывает проверка
Код:
if (x!=0)
{
  // ....
}
   else (ShowMessage("Деление на 0"));
Когда шаг 0.4, то х переходит через точку 0. Он бывает -0.2 и потом сразу 0.2. Поэтому всё работает. Согласись, на этот раз отмазка про паскаль уже не прокатит :-)
FataLL вне форума Ответить с цитированием
Старый 07.04.2013, 18:21   #6
Oban
Пользователь
 
Регистрация: 07.04.2013
Сообщений: 10
По умолчанию

речь не об этом промежуток -5;5 я указал только ради примера
ясное дело что при любом шаге в 0 должен попадать


Oban вне форума Ответить с цитированием
Старый 07.04.2013, 20:25   #7
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

В случае -5 и 5 с шагом 0.4 х нулю не равен никогда. Поэтому ошибка не выводится. Т.е., не при любом шаге идёт попадание в ноль. Если тебе это понятно, тогда не совсем ясно, о чём ты спрашиваешь?
FataLL вне форума Ответить с цитированием
Старый 07.04.2013, 21:33   #8
Oban
Пользователь
 
Регистрация: 07.04.2013
Сообщений: 10
По умолчанию

я же выложил скрины чтобы было видно, ты не понимаешь меня...
короче, вопрос - почему не промежутке -5 до 5 с шагом 1 при попадании в 0 выскакивает ошибка, все норм, а при шаге 0.2 на том же промежутку -5 до 5 при попадании в 0 не вылазит ошибка?
Oban вне форума Ответить с цитированием
Старый 08.04.2013, 18:16   #9
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Это особенности вычислительной математики. Дело в том, что на отрезке от -1.2 до 1.2 x у тебя принимает значения не совсем такие, которые ты ожидаешь
Цитата:
-1,2
-0,999999999999998
-0,799999999999998
-0,599999999999998
-0,399999999999998
-0,199999999999998
2,16493489801906E-15
0,200000000000002
0,400000000000002
0,600000000000002
0,800000000000002
1
1,2
Т.е., для корректного сравнения тебе надо учитывать погрешность. 2,16493489801906E-15 - это конечно почти 0, но с точки зрения логики x != 0, всё правильно.
FataLL вне форума Ответить с цитированием
Старый 08.04.2013, 19:38   #10
Oban
Пользователь
 
Регистрация: 07.04.2013
Сообщений: 10
По умолчанию

хм действительно точность подводит ну и ладно сойдет и так
Oban вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с расчетом общего объема дохода 3ai4i6ka Помощь студентам 0 08.10.2011 13:31
Проблема с функцией Power и расчетом.... Bill Gates Общие вопросы Delphi 2 12.04.2010 05:25
помогите с расчетом периода времени Hitzkopf Microsoft Office Excel 3 30.11.2009 09:27
Проблема с расчетом yka777 Microsoft Office Excel 17 05.06.2009 15:53
Проблема с расчетом из БД Apollo_13 БД в Delphi 9 11.06.2007 12:12