File: WEXAKT.PS of Tape: Various/Decus/decus-3
(Source file text) 

PROGRAM WURZEL2EXAKT(INPUT,OUTPUT);


(*)
(   QUADRATWURZEL AUS 2  AUF BIS ZU 1000 STELLEN GENAU
(   BERECHNET MITTELS DER
(
(   BINOMIALREIHE  SQRT(1+X) =
(
(            (1/2)         (1/2)                 (1/2)
(   =  1  +  (   ) * X  +  (   ) * X^2  + ... +  (   ) * X^K  + ...
(            ( 1 )         ( 2 )                 ( K )
(
(
(   KONVERGENZBESCHLEUNIGUNG WIRD DURCH
(
(   SQRT(2)  =  10/7 * SQRT(2 * 49/100)  =  10/7 * SQRT(1 - 2/100)
(
(   ERREICHT, DAMIT IST  X = -0.02  UND ALLE GLIEDER
(   DER REIHE (BIS AUF 1) SIND NEGATIV.
(
(   SOMIT ERGIBT SICH:
(
(       S Q R T ( 2 )  =  ( 1 - REIHENSUMME ) * 10 / 7
(
(*)

CONST   BASE (*OF ARITHMETIC*) = 100000 (*DON'T CHANGE THIS!*);

TYPE    LONGNUMBER = ARRAY[0..205] OF INTEGER;

VAR     NUMBEROFDIGITS, FIRST, LAST, I, K, M, D,
        DIGIT, CARRY, POWER: INTEGER;
        A (*GLIED*),
        S (*SUMME*): LONGNUMBER;


BEGIN
    READ(NUMBEROFDIGITS);
    FIRST := 1;  LAST := NUMBEROFDIGITS DIV 5  +  4;

(*)
(   AUFSTELLEN DES ANFANGSGLIEDES DER REIHE ( = 0.01 )
(   UND DES ANFANGSWERTES DER SUMME
(*)

    K := 1;
    FOR I := 0 TO LAST DO
        BEGIN  A[I] := 0;  S[I] := 0  END;
    A[1] := 10000;  S[1] := 10000;
    A[LAST+1] := BASE  (* GUARD *);


REPEAT  K := K + 1;

    (*)
    (   REKURSIVE BERECHNUNG DES NAECHSTEN GLIEDES DER REIHE:
    (
    (         A  <===  A * (2*K - 3) / 100 / K
    (
    (*)

    M := K+K - 3;
    I := LAST+1;  CARRY := 0;
    WHILE (FIRST<I) OR (CARRY<>0) DO
      BEGIN
        I := I - 1;
        DIGIT  := M*A[I] + CARRY;
        A[I]   := DIGIT MOD BASE;
        CARRY  := DIGIT DIV BASE;
      END;
    FIRST := I;

    D := 100*K;
    CARRY := 0;
    FOR I := FIRST TO LAST DO
      BEGIN
        DIGIT := CARRY*BASE + A[I];
        A[I]  := DIGIT DIV D;
        CARRY := DIGIT MOD D
      END;

    WHILE A[FIRST]=0 DO FIRST := FIRST + 1;

    (*)
    (   AUFSUMMIERUNG   SUMME  <===  SUMME + GLIED
    (*)

    I := LAST;  CARRY := 0;
    WHILE (FIRST<=I) OR (CARRY<>0) DO
      BEGIN
        DIGIT := S[I] + A[I] + CARRY;  CARRY := 0;
        IF DIGIT >= BASE THEN BEGIN
                                DIGIT := DIGIT - BASE;
                                CARRY := 1
                              END;
        S[I] := DIGIT;
        I := I - 1
      END

UNTIL FIRST>LAST;

(*)
(   SUBTRAHIERE SUMME DER REIHE VON  1
(*)

    I := LAST;
    WHILE S[I]=0 DO I := I-1;
    S[I] := BASE - S[I];
    FOR I := I-1 DOWNTO 1 DO S[I] := BASE-1 - S[I];
    S[0] := 9;

(*)
(   DIVISION DURCH  7
(*)

    CARRY := 0;
    FOR I := 0 TO LAST DO
      BEGIN
        DIGIT := CARRY*BASE + S[I];
        S[I]  := DIGIT DIV 7;
        CARRY := DIGIT MOD 7
      END;

(*)
(   A U S G A B E :
(*)

    WRITELN; WRITE("SQRT(2) = 1.");
    FOR I := 1 TO LAST-4 DO
      BEGIN
        DIGIT := S[I];  POWER := BASE;
        REPEAT POWER := POWER DIV 10;
            WRITE(DIGIT DIV POWER:1);
            DIGIT := DIGIT MOD POWER
        UNTIL POWER=1;
        IF I MOD 10 = 0 THEN BEGIN WRITELN; WRITE(" ":12) END
      END;
    WRITELN
END.