как использовать большую точность в С++

Привет, я построил алгоритм для вычисления пи, но я использую для него длинное число с плавающей запятой, поэтому в результате я просто получаю 3,14159, мне нужно больше точности. Как? вот код:

    #include <iostream>
#include <math.h>
using namespace std;

int main ()
{
  long double a, l, p, pi, r;
  long long int n, m;
  r = 100000;
  a = r * sqrt (3) / 2 ;
  n = 100000;
  m = 6;
  while (n > m)
  {
    a = sqrt (r / 2 * (r + a));
  m = m * 2 ;
  }
  l = sqrt (4 * (pow (r, 2) - pow (a, 2)));
  p = m * l;
  pi = p / (2 * r) ;
  cout << pi << endl;
  cout << "number of corners used: " << m << endl;
  return 0;
}

Кстати, в моей школе есть 24-ядерный (12 двухъядерных узлов) суперкомпьютер, на всякий случай.


person Sakhs Modioths    schedule 18.12.2014    source источник
comment
Если для вашего алгоритма вычисления pi требуется 24-ядерный суперкомпьютер, вы делаете это неправильно. Дополнительные ядра здесь даже не помогут, поскольку вы не используете потоки.   -  person tadman    schedule 18.12.2014
comment
Ну, один из способов повысить точность (и за постоянное время): cout << M_PI;.   -  person i_am_jorf    schedule 18.12.2014
comment
Если ваша цель состоит в том, чтобы вычислить десятичные дроби числа пи, вы можете рассмотреть возможность использования какого-либо целочисленного массива для хранения десятичных дробей. Это, конечно, потребует некоторой модификации вашего алгоритма.   -  person warsac    schedule 18.12.2014


Ответы (3)


В этом числе больше точности, чем вы показываете. Вы просто должны попросить об этом:

cout << std::setprecision(40) << pi << endl;

Это дает мне 3,141592653543740176758092275122180581093 при запуске на Codepad.

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

person tadman    schedule 18.12.2014
comment
пытаясь выстрелить в компьютер за его пределы - person Sakhs Modioths; 18.12.2014
comment
Неправильно говорить, что long double не поддерживается. Скорее, Стандарт не требует большей точности, чем просто double. Но он абсолютно определен как часть языка и требуется для поддержки всех тех же операций, что и два других типа с плавающей запятой. Кстати, нет ANSI C++ только ISO C++ - person Ben Voigt; 18.12.2014
comment
ошибка: 'setprecision' не является членом 'std'| что я сделал не так, используя кодовые блоки - person Sakhs Modioths; 18.12.2014
comment
long double is not supported in ANSI C++. Хм?! Он абсолютно поддерживается, он отличается от double, например, на MinGW-w64, и обеспечивает более высокую точность. - person Severin Pappadeux; 18.12.2014
comment
Моя ошибка. Предупреждение компилятора было следующим: Строка 8: ошибка: ISO C++ не поддерживает 'long long'. - person tadman; 18.12.2014
comment
@SakhsModioths Вам необходимо подключить библиотеку: #include ‹iomanip› - person Lanet; 03.11.2019

Если вам действительно нужна большая точность (а не просто отображение большего количества знаков после запятой), вы можете рассмотреть возможность использования библиотеки GMP (Gnu Multi-precision). Вы можете указать количество байтов, которые будут использоваться для ваших двойников (8 байтов, 16 байтов, 32 байта, 64 байта, 128 байтов,...). Библиотека обычно используется для крито-алгоритмов (для которых нужны действительно большие целые числа).

https://gmplib.org/

Вы, вероятно, захотите взглянуть на этот похожий поток: ">C++ вычисляет точнее, чем double или long double

person TravisJ    schedule 18.12.2014
comment
извините, не могу голосовать с такой репутацией, но мне это понравилось - person Sakhs Modioths; 18.12.2014
comment
Я голосую от вашего имени, @SakhsModioths - person Shahriar; 18.12.2014

person    schedule
comment
Имейте в виду, что это напечатает 400 цифр, но большинство из них будут мусорными битами (поскольку 8-байтовый двойник не будет содержать такой точности). - person TravisJ; 18.12.2014
comment
В лучшем случае вы получите 323 хороших цифры при использовании 8-байтового двойника. Но на практике из-за числовых проблем у вас будет гораздо меньше точных цифр. - person TravisJ; 18.12.2014
comment
400 — это пример FPU большинства процессоров, которые в те дни были 64-битными (некоторые оптероны с 256-битными) - person Sakhs Modioths; 19.12.2014
comment
Любое представимое число с плавающей запятой (с 8 байтами) будет выглядеть как M*2^e, где e›= -1024, а M — целое число. Таким образом, наименьшее число, которое вы можете представить (положительное число), равно 1/2^1024, которое имеет 323 десятичных разряда. - person TravisJ; 19.12.2014