-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpi.c
More file actions
95 lines (84 loc) · 2.11 KB
/
Copy pathpi.c
File metadata and controls
95 lines (84 loc) · 2.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/**
HexPi
By Sullivan Devries
Original Algorithm by Simon Plouffe in collaboration with David H. Bailey and Peter Borwein
**/
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
#define P 10 // Accuracy for Bn()
double Bn(int a, int n);
double An(int a, int n);
unsigned long long pow16(int n, int a, int k);
double ABn(int a, int n);
char getPi(unsigned int num);
double shave(double s);
int main(int argc, char* argv[]){
int uin1;
printf("Enter an option:\n");
printf("1.) Print digits of pi starting from the beginning\n");
printf("2.) Print nth digit of pi\n");
printf("\nYour selection: ");
scanf("%d", &uin1);
if(uin1==1){
//printf("\n3.");
int n = 1;
while(true){
printf("%X",getPi(n));
n++;
if((n-1)%64==0) printf("\n");
}
}
else if (uin1==2){
int uin2;
printf("What number would you like to calculate: ");
scanf("%d",&uin2);
printf("\nCalculating...");
printf("\nHex digit number %d of pi is %x\n",uin2,getPi(uin2));
}
else{
return 1;
}
return 0;
}
double Bn(int a, int n){
double s = 0;
for(int k=n;k<n+10+P;k++){
double n16 = pow(16,(n-k));
double f = n16/((8*k)+a);
s += f;
}
return s;
}
double An(int a, int n){
double s = 0;
for(int k=0;k<=n-1;k++){
double y = pow16(n-k,a,k)/(double)((8*k)+a);
s += y;
s = shave(s);
}
return s;
}
unsigned long long pow16(int e, int a, int k){ // e is n-k
if(e == 0) return 1;
if(e == 1) return 16;
unsigned long long R = pow16(e/2, a, k);
if(e%2==0) return (R*R)%((8*k)+a);
else return (R*R*16)%((8*k)+a);
}
double ABn(int a, int n){
return An(a,n) + Bn(a,n);
}
char getPi(unsigned int num){
int n = num - 1;
double sum = 4*ABn(1,n) - 2*ABn(4,n) - ABn(5,n) - ABn(6,n);
char f = 0xF & lrintf(floorf(16*sum)); // voodoo magic
return f;
}
double shave(double s){ // Helper to make sure the sum doesnt grow too big
int d = (int)lrintf(s);
if(s >= 1 || s <= -1){
s-=d;
}
return s;
}