Хотя цикл с точностью как условие - PullRequest
0 голосов
/ 15 марта 2012

Можно ли сделать цикл while в C ++, пока десятичная дробь не достигнет определенной точности? Я хочу сделать длинный расчет для arctan, а затем pi, и я хочу, чтобы цикл работал до тех пор, пока pi не будет вычислено с точностью до десятого знака после запятой по формуле pi = 4 (arctan (1.0)). Я вручную вычисляю арктан, используя формулу ряда Тейлора. Я знаю, что есть встроенные функции для этих вычислений, но это домашнее задание, поэтому я должен сделать это так. Я не ищу решение проблемы, просто возможен ли цикл с использованием точности. Спасибо!

Edit:

Я все еще застрял с этим! Я не могу придумать правильный аргумент для цикла while, даже после того, как перебрал все намеки. Действительно нужна помощь. Вот код, который я придумал:

#include <iomanip>
#include <cstdlib>
#include <iostream>
#include <cmath>

using namespace std;

int main(void)
{
 int i;
 long double result;
 long double pi;
 int y=3;
 int loopcount=0;
 long double precision;

   cout<<"Start\n";

   result=1-(pow(1,y)/y);

  do
    {
     y=y+2;
     result=result+(pow(1,y)/y);
     y=y+2;
     result=result-(pow(1,y)/y);

      pi=4*(result);
      precision=(pi*(pow(10,11))/10);

      loopcount++;
    }
  while(//This is the problem!);

  cout<<"Final Arctan is:"<<endl;
     cout<<setprecision(20)<<result<<endl;
  cout<<"Final Pi is:"<<endl;
       cout<<setprecision(9)<<pi1<<endl;
  cout<<"Times looped:"<<endl;
       cout<<loopcount<<endl;

return 0;
}

Ответы [ 4 ]

4 голосов
/ 15 марта 2012

Насколько я помню, вы можете выяснить точность, проверив улучшение по сравнению с предыдущими итерациями. Если 10-е десятичное место становится стабильным, прервите цикл.

, чтобы получить k-ю десятичную цифру n, умножьте ее на 10 до степени k и получите наименее значимую цифру. Например, чтобы получить 2-ю десятичную цифру 7 из 3.47, умножьте ее на 100, чтобы получить 347, а 7 - на 347 % 10.

3 голосов
/ 15 марта 2012

Вы можете поддерживать переменную с результатом из последнего цикла, затем выполнять цикл, пока разница между ними не окажется в приемлемом диапазоне.

Редактировать: удален фрагмент кода для домашней работы

1 голос
/ 15 марта 2012

Что касается прерывания цикла, ответ, конечно, да. Есть много способов сделать это.

Я бы хотел сравнить усеченное значение с фактическим значением.

Например: while (myValue <= Truncate (myValue, precision)) сломается, когда myValue больше myValue, усеченного до одного порядка точности Помните, что добавление порядка точности увеличивает число (1.1> 1)

В соусе Truncate есть специальный соус, который должен возвращать усеченное значение с любой точностью, которую вы выберете. Например, Truncate (1.23456, 3) должен вернуть 1.234 (подсказка: 1.23 * 10 == 12.3)

1 голос
/ 15 марта 2012

Да, по крайней мере, вроде. Обычно в таком случае вы на самом деле не ищите абсолютную точность (в конце концов, если вы вычисляете число Пи, используйте заранее известное значение Пи, чтобы решить, когда вы закончите, что-то вроде достижения цели).

Вместо этого большинство таких вычислений постепенно приближаются к цели, и для каждой итерации изменение значения постепенно уменьшается. Вы смотрите на это изменение в значении, и когда оно становится достаточно маленьким, вы рассматриваете значение достаточно близко и выходите из цикла.

...