21 Востаннє редагувалося Mafia (29.10.2013 21:03:59)

Re: Поможіть обчислити значення виразу

koala написав:
tempC=rowElement(i,a2,1.0/9);

Точно?

я так написав через те,що 1/4 буде 0(цілочесельне ділення),тому я так написав щоб ця операція трактувалась як double
a a2 на a3 я замінив,але суті не міняє,та сама помилка

22

Re: Поможіть обчислити значення виразу

поможіть хто знає

23 Востаннє редагувалося koala (30.10.2013 11:11:06)

Re: Поможіть обчислити значення виразу

От йой... виявляється, в MinGW до 4.7 був баг із виводом long double. А я цілу годину про... провів наодинці з Dev-C++, доки зрозумів, що баг не в програмі.
Ось виправлений варіант, тримайте:

Прихований текст
//Обчислення виразу з е точнісю
#include <iostream>
#include <iomanip> //для setprecision
#include <cmath>
 
using namespace std;

/*функції під коренями; 
не бачу сенсу переносити тіло в кінець, всеодно по одному рядку */
long double f1(long double x){ return 1.-pow(cos(x),4.)/4.; }
long double f2(long double x){ return 1.+atan(x)/2.; }
long double f3(long double x){ return 1./(3.+x*x); }

//останній множник i-го члену ряда Тейлора - і жодних факторіалів!
long double rowMult(unsigned i, long double x, long double a)
  { return x*(a-i+1)/i; }
  
int main()
{
  setlocale(LC_ALL,"");
  long double e,t;
  cout << "Введiть похибку e = ";
  cin >> e;
  cout << "Введiть t = ";
  cin >> t;
  long double A=1, //поточні наближення елементів формули
              B=1,
              C=1,
              tempA = 1, //останні члени елементів формули
              tempB = 1,
              tempC = 1,
              a1 = f1(t)-1, //підкорінні вирази для Тейлора
              b1 = f2(t)-1,
              c1 = f3(t)-1;
  cout<<"Обчисюємо...\n";
  for(int i = 1; e < abs(tempA)+abs(B*tempC)+abs(C*tempB); i++ )
  {
    A += ( tempA *= rowMult ( i, a1, 1./4. ) );
    B += ( tempB *= rowMult ( i, b1, 1./5. ) );
    C += ( tempC *= rowMult ( i, c1, 1./9. ) );
    cout << "Крок " << i << ":";
    cout << setprecision(5) << fixed
         << "(" << A << "~" << abs(tempA) << ")+(" 
                << B << "~" << abs(tempB) << ")*(" 
                << C << "~" << abs(tempC) << ")="
                << A+B*C << "~" << abs(tempA)+abs(B*tempC)+abs(C*tempB)<<endl;
  }
  cout << endl
       << "Вiдповiдь: " << A+B*C << "~" 
       << abs(tempA)+abs(B*tempC)+abs(C*tempB)<< endl
       << "Контрольна вiдповiдь : " 
       << pow( f1(t), 1./4. ) + pow( f2(t), 1./5. ) * pow( f3(t), 1./9. ) << "="
       << pow( f1(t), 1./4. ) << "+" << pow( f2(t), 1./5. ) << "*" 
       << pow( f3(t), 1./9. ) << endl;
  system("PAUSE");
}

Ви забували на x^i множити.

Подякували: Mafia1