[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: GMP precision problem - only getting 15 places of PI
From: |
nmenuj |
Subject: |
Re: GMP precision problem - only getting 15 places of PI |
Date: |
19 Sep 2005 07:59:42 -0700 |
User-agent: |
G2/0.2 |
The output is correct after incorporating the change David pointed out.
Mensanator, please see below for the changed program using precomputed
mpf's for the float literals in the loop. There is some speedup I
think. I thought the type promotion for a const would occur just once
in a C++ program, had no idea it runs inside the loop code.
I appreciate your comments.
Before (changing constants to mpfs):
real 0m1.236s
user 0m1.191s
sys 0m0.001s
After:
real 0m1.225s
user 0m1.177s
sys 0m0.002s
I know the loop bounds are way more than required for just 100 digits,
but I suppose they are good for performance checking.
#include <iostream>
#include <gmpxx.h>
using namespace std;
const int PREC=20000;
mpf_class pival(0.0, PREC);
mpf_class d2(1.0, PREC), d3(1.0,PREC);
const mpf_class const_1(1.0, PREC);
const mpf_class const_2(2.0, PREC);
const mpf_class const_3(3.0, PREC);
const mpf_class const_4(4.0, PREC);
const mpf_class const_9(9.0, PREC);
const mpf_class const_16(16.0, PREC);
const mpf_class const_81(81.0, PREC);
int main()
{
int i = 0;
mpf_set_default_prec(PREC);
d2 = const_1/const_2;
pival = d2 - (d2/const_4)/const_3;
for (i=5;i<20000;i+=4)
{
d2 /= const_16;
pival = pival + d2/i;
pival = pival - (d2/const_4)/(i + 2);
}
cout << "def prec " << mpf_get_default_prec() << '\n';
d3 = mpf_class(1.0, PREC)/const_3;
pival = pival + d3 - (d3/const_9)/const_3;
for (i=5;i<20000;i+=4)
{
d3 /= const_81;
pival = pival + d3/i;
pival = pival - (d3/const_9)/(i + 2);
}
cout.precision(100);
cout << pival * 4.0 << '\n';
return 0;
}