1 PROGRAM WURZEL2EXAKT(INPUT,OUTPUT);
5 ( QUADRATWURZEL AUS 2 AUF BIS ZU 1000 STELLEN GENAU
6 ( BERECHNET MITTELS DER
8 ( BINOMIALREIHE SQRT(1+X) =
11 ( = 1 + ( ) * X + ( ) * X^2 + ... + ( ) * X^K + ...
15 ( KONVERGENZBESCHLEUNIGUNG WIRD DURCH
17 ( SQRT(2) = 10/7 * SQRT(2 * 49/100) = 10/7 * SQRT(1 - 2/100)
19 ( ERREICHT, DAMIT IST X = -0.02 UND ALLE GLIEDER
20 ( DER REIHE (BIS AUF 1) SIND NEGATIV.
24 ( S Q R T ( 2 ) = ( 1 - REIHENSUMME ) * 10 / 7
28 CONST BASE (*OF ARITHMETIC*) = 100000 (*DON'T CHANGE THIS!*);
30 TYPE LONGNUMBER = ARRAY[0..205] OF INTEGER;
32 VAR NUMBEROFDIGITS, FIRST, LAST, I, K, M, D,
33 DIGIT, CARRY, POWER: INTEGER;
35 S (*SUMME*): LONGNUMBER;
40 FIRST := 1; LAST := NUMBEROFDIGITS DIV 5 + 4;
43 ( AUFSTELLEN DES ANFANGSGLIEDES DER REIHE ( = 0.01 )
44 ( UND DES ANFANGSWERTES DER SUMME
49 BEGIN A[I] := 0; S[I] := 0 END;
50 A[1] := 10000; S[1] := 10000;
51 A[LAST+1] := BASE (* GUARD *);
57 ( REKURSIVE BERECHNUNG DES NAECHSTEN GLIEDES DER REIHE:
59 ( A <=== A * (2*K - 3) / 100 / K
64 I := LAST+1; CARRY := 0;
65 WHILE (FIRST<I) OR (CARRY<>0) DO
68 DIGIT := M*A[I] + CARRY;
69 A[I] := DIGIT MOD BASE;
70 CARRY := DIGIT DIV BASE;
76 FOR I := FIRST TO LAST DO
78 DIGIT := CARRY*BASE + A[I];
83 WHILE A[FIRST]=0 DO FIRST := FIRST + 1;
86 ( AUFSUMMIERUNG SUMME <=== SUMME + GLIED
89 I := LAST; CARRY := 0;
90 WHILE (FIRST<=I) OR (CARRY<>0) DO
92 DIGIT := S[I] + A[I] + CARRY; CARRY := 0;
93 IF DIGIT >= BASE THEN BEGIN
94 DIGIT := DIGIT - BASE;
104 ( SUBTRAHIERE SUMME DER REIHE VON 1
108 WHILE S[I]=0 DO I := I-1;
110 FOR I := I-1 DOWNTO 1 DO S[I] := BASE-1 - S[I];
118 FOR I := 0 TO LAST DO
120 DIGIT := CARRY*BASE + S[I];
129 WRITELN; WRITE("SQRT(2) = 1.");
130 FOR I := 1 TO LAST-4 DO
132 DIGIT := S[I]; POWER := BASE;
133 REPEAT POWER := POWER DIV 10;
134 WRITE(DIGIT DIV POWER:1);
135 DIGIT := DIGIT MOD POWER
137 IF I MOD 10 = 0 THEN BEGIN WRITELN; WRITE(" ":12) END