Использование длинного двойного или просто двойного для вычисления пи? - PullRequest
2 голосов
/ 21 марта 2012

Я вычисляю пи по длинной формуле. Я пытаюсь поближе познакомиться с числами с плавающей запятой и т. Д. У меня есть рабочая программа, использующая двойные числа. Проблема с моим кодом:

  1. Если я использую двойное число, то пи с точностью до седьмого знака после запятой. Я не могу заставить его быть более точным.
  2. Если я использую длинное двойное число, пи с точностью до 9-го знака после запятой, однако выполнение кода занимает гораздо больше времени. Если я проверяю точность менее 0,00000001, используя long double, pi возвращает значение 9,4246775. Я предполагаю, что это связано с длинным дублем.

Мой вопрос: какой тип переменной самый точный? Как я могу изменить свой код, чтобы повысить точность пи?

Вот мой код:

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

using namespace std;

int main()
{
 double arctan;
 double pi;
 double precision;
 double previous=0;
 int y=3;
 int loopcount=0;

   cout<<"Start\n";

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

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

      pi=4*(arctan);

    //  cout<<"Pi is: ";
    //  cout<<setprecision(12)<<pi<<endl;

      precision=(pi*(pow(10,10)/10));

      loopcount++;

      if(precision-previous<0.000000001)
        break;

      previous=precision;
    }
  while(true);

  cout<<"Pi is:"<<endl;
       cout<<setprecision(11)<<pi<<endl;
  cout<<"Times looped:"<<endl;
       cout<<loopcount<<endl;

return 0;
}

Ответы [ 3 ]

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

Вы можете получить максимальные пределы парных / длинных парных чисел из std :: numeric_limits

#include <iostream>
#include <limits>

int main()
{
    std::cout << "     Double::digits10:  " << std::numeric_limits<double>::digits10 << "\n";
    std::cout << "Long Double::digits10:  " << std::numeric_limits<long double>::digits10 << "\n";
}

На моей машине это дает:

     Double::digits10:  15
Long Double::digits10:  18

Так что я ожидаю, что long double будетс точностью до 18 цифр.
Определение этого термина можно найти здесь:

http://www.cplusplus.com/reference/std/limits/numeric_limits/

Стандартная цитата: 18.3.2 Numeric limits [limits]

Также примечание: каккомментарий находится в нижнем списке выше:

То, что @sarnold неверен (хотя по его таинственным причинам два глупых человека проголосовали за его комментарий без проверки) в своих утверждениях о pow ().То, что он утверждает, применимо только к C. C ++ имеет перегрузки для типов, потому что в C ++ pow () является функцией шаблона.См .: http://www.cplusplus.com/reference/clibrary/cmath/pow/ в стандарте на 26.4.7 complex value operations [complex.value.ops]

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

Предопределенный тип с плавающей запятой с наибольшей точностью равен long double.

Существует три предопределенных типа с плавающей запятой:

  • float имеет не менее 6 десятичных знаковцифры точности
  • double имеют по крайней мере 10, и по крайней мере столько, сколько float
  • long double имеет по крайней мере 10 и по крайней мере столько же, сколько double

Это минимальные требования;Любой или все эти типы могут иметь большую точность.

Если вам нужна более высокая точность, чем может обеспечить long double, вы можете взглянуть на GMP , который поддерживает произвольную точность (при значительных затратах вскорость и использование памяти).

0 голосов
/ 21 марта 2012

Или вы можете просто жестко закодировать цифры PI и посмотреть, что произойдет.^ _ ^

http://www.joyofpi.com/pi.html

...