mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-10 05:48:59 +02:00
no message
This commit is contained in:
parent
b981d971c9
commit
82d0a7f5e9
91
tests/bench/pi.c
Normal file
91
tests/bench/pi.c
Normal file
@ -0,0 +1,91 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
void ComputePi(int numdigits, char* pi)
|
||||
{
|
||||
int alength = 10 * numdigits / 3;
|
||||
int* a = (int*) malloc(alength * sizeof(int));
|
||||
int piLength = 0;
|
||||
int nines = 0;
|
||||
int predigit = 0;
|
||||
int i, j;
|
||||
for(i = 0; i < alength; ++i)
|
||||
a[i] = 2;
|
||||
|
||||
for (j = 0; j < numdigits; ++j)
|
||||
{
|
||||
int q = 0;
|
||||
int p = 2 * alength - 1;
|
||||
for (i = alength; --i >= 0; )
|
||||
{
|
||||
int x = 10*a[i] + q*(i+1);
|
||||
a[i] = x % p;
|
||||
q = x / p;
|
||||
p -= 2;
|
||||
}
|
||||
|
||||
a[0] = q % 10;
|
||||
q /= 10;
|
||||
if (q == 9)
|
||||
++nines;
|
||||
else if (q == 10)
|
||||
{
|
||||
int k;
|
||||
pi[piLength] = (char) (predigit + 1 + '0');
|
||||
for (k = 1; k <= nines; ++k)
|
||||
pi[piLength+k] = '0';
|
||||
piLength += nines + 1;
|
||||
predigit = 0;
|
||||
nines = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
int k;
|
||||
pi[piLength] = (char)(predigit + '0');
|
||||
predigit = q;
|
||||
for (k = 1; k <= nines; ++k)
|
||||
pi[piLength + k] = '9';
|
||||
piLength += nines + 1;
|
||||
nines = 0;
|
||||
}
|
||||
}
|
||||
pi[piLength] = (char)(predigit + '0');
|
||||
pi[piLength+1] = '\0';
|
||||
|
||||
free(a);
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int numdigits;
|
||||
char* pi;
|
||||
|
||||
if (argc <= 1)
|
||||
{
|
||||
fprintf(stderr, "usage: pi #DIGITS [FILE]");
|
||||
return 1;
|
||||
}
|
||||
|
||||
numdigits = atoi(argv[1]);
|
||||
pi = (char*) malloc(numdigits+1);
|
||||
ComputePi(numdigits, pi);
|
||||
|
||||
if (argc > 2)
|
||||
{
|
||||
FILE* fp = fopen(argv[2], "w");
|
||||
if (fp == NULL)
|
||||
{
|
||||
fprintf(stderr, "Cannot open %s\n", argv[2]);
|
||||
return 2;
|
||||
}
|
||||
fputs(pi, fp);
|
||||
fputc('\n', fp);
|
||||
fclose(fp);
|
||||
}
|
||||
else
|
||||
puts(pi);
|
||||
|
||||
free(pi);
|
||||
|
||||
return 0;
|
||||
}
|
96
tests/bench/pi.pp
Normal file
96
tests/bench/pi.pp
Normal file
@ -0,0 +1,96 @@
|
||||
program pi;
|
||||
|
||||
{$ifdef fpc}
|
||||
{$mode objfpc}
|
||||
{$endif fpc}
|
||||
|
||||
{$APPTYPE CONSOLE}
|
||||
|
||||
{$h+}
|
||||
|
||||
uses
|
||||
timer;
|
||||
|
||||
function ComputePi(NumDigits: Integer): string;
|
||||
var
|
||||
A: array of LongInt;
|
||||
I, J, K, P, Q, X, Nines, Predigit: Integer;
|
||||
PiLength: Integer;
|
||||
begin
|
||||
start;
|
||||
SetLength(A, 10*NumDigits div 3);
|
||||
SetLength(Result, NumDigits+1);
|
||||
PiLength := 1;
|
||||
for I := Low(A) to High(A) do
|
||||
A[I] := 2;
|
||||
Nines := 0;
|
||||
Predigit := 0;
|
||||
for J := 0 to NumDigits-1 do
|
||||
begin
|
||||
Q := 0;
|
||||
P := 2 * High(A) + 1;
|
||||
for I := High(A) downto Low(A) do
|
||||
begin
|
||||
X := 10*A[I] + Q*(I+1);
|
||||
A[I] := X mod P;
|
||||
Q := X div P;
|
||||
P := P - 2;
|
||||
end;
|
||||
A[Low(A)] := Q mod 10;
|
||||
Q := Q div 10;
|
||||
if Q = 9 then
|
||||
Inc(Nines)
|
||||
else if Q = 10 then
|
||||
begin
|
||||
Result[PiLength] := Chr(Predigit + 1 + Ord('0'));
|
||||
for K := 1 to Nines do
|
||||
Result[PiLength+K] := '0';
|
||||
PiLength := PiLength + Nines + 1;
|
||||
Predigit := 0;
|
||||
Nines := 0;
|
||||
end
|
||||
else
|
||||
begin
|
||||
Result[PiLength] := Chr(Predigit + Ord('0'));
|
||||
Predigit := Q;
|
||||
for K := 1 to Nines do
|
||||
Result[PiLength+K] := '9';
|
||||
PiLength := PiLength + Nines + 1;
|
||||
Nines := 0;
|
||||
end;
|
||||
end;
|
||||
Result[PiLength] := Chr(Predigit + Ord('0'));
|
||||
stop;
|
||||
end;
|
||||
|
||||
var
|
||||
NumDigits: Integer;
|
||||
Code: Integer;
|
||||
F: TextFile;
|
||||
result : string;
|
||||
begin
|
||||
if ParamCount = 0 then
|
||||
WriteLn('usage: pi #DIGITS [FILE]')
|
||||
else
|
||||
begin
|
||||
Val(ParamStr(1), NumDigits, Code);
|
||||
if Code <> 0 then
|
||||
begin
|
||||
WriteLn('Invalid # digits: ', ParamStr(1));
|
||||
Halt(1);
|
||||
end;
|
||||
|
||||
if ParamCount > 1 then
|
||||
begin
|
||||
AssignFile(F, ParamStr(2));
|
||||
Rewrite(F);
|
||||
WriteLn(F, ComputePi(NumDigits));
|
||||
CloseFile(F);
|
||||
end
|
||||
else
|
||||
begin
|
||||
result:=ComputePi(NumDigits);
|
||||
WriteLn(result);
|
||||
end;
|
||||
end;
|
||||
end.
|
Loading…
Reference in New Issue
Block a user