Calculez pi avec un Apple II

Je suis tombé récemment sur un livre que j’avais acheté fin des années 90, « Le fascinant nombre pi«  de Jean-Paul DELAHAYE.

Le livre décrit un programme mystérieux calculant les 2400 premières décimales de pi. Le code est du C et l’aspect intéressant est qu’il est très court, et également très cryptique. Nous allons voir s’il est possible de calculer pi sur un Apple II en utilisant ce code…

Le programme d’origine

Le voici :

int a=10000,b,c=8400,d,e,f[8401],g;main(){for(;b-c;)f[b++]=a/5;for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f[b]*a,f[b]=d%--g,d/= g--,--b;d*=b);}

Ce code illisible compile sans problème avec gcc (avec néanmoins quelques warning) et le programme fonctionne très bien. Voici le programme mis au propre dans un C un peu plus lisible :

//=============================================================================
// PROGRAMME : CALCUL DE PI
// *********
// Programme issu du livre "Le fascinant nombre PI"
//
// LOG :
// ***
//  29/10/2023  v1.0    DR  Premiere version
//
//=============================================================================
#include <stdio.h>
#define N 8400
#define A 10000

int d = 0, f[N+1];
int b = 0, c = N, e = 0, g = 0;

int main() {
    printf("\n");
    
    for (b=0; b < c; ++b)
        f[b] = A / 5;

    while (c > 0) {
        g = c * 2; 
        d = 0;
        b = c;

        while (b > 0) {
            d += f[b] * A; --g;
            f[b] = d % g; d /= g;
            --g ; --b;

            if (b != 0)
                d *= b;
        }

        c -= 14;    
        printf("%.4d",e+d/A);
        e = d % A;
    }
    printf("\n");
    return(0);
}

Cette version compile sans warning, et donne exactement le même résultat, à savoir les 2400 premiers chiffres de pi. A noter qu’il n’y a pas de point entre la partie entière et les décimales, mais on reconnait pi malgré cette imperfection.

Adaptation pour Apple II

Il est très simple d’adapter le précédent code pour le compiler avec cc65 et le faire tourner sur un Apple II. La seule modification à faire est de modifier le type de la variable d et du tableau f, qui passe en long int. En effet, le type int est codé sur 16 bits avec cc65 / Apple II ce qui est insuffisant pour ces variables.

Voici l’archive contenant le fichier source pi_a2.c

L’archive contient également un Makefile permettant de compiler pour Linux (make linux) et Apple II (make a2). La commande make install effectue l’installation de l’exécutable pour Apple II sur l’image de la disquette DEV.dsk. Ceci nécessite d’avoir l’outil AppleCommander présent dans le répertoire /usr/local/share/applecommander.

Voici le résultat :

Le programme fonctionne mais il est extrêmement lent sur Apple II ! J’ai donc limité le nombre de décimales calculées en passant la constante N de 8400 à 1000.

Aspect théorique

L’algorithme utilise une série d’Euler donnant pi. Le calcul est effectué en base 10000 et le programme affiche donc les chiffres par groupes de 4. L’explication détaillée figure en page 97 du livre « Le fascinant nombre pi«  que je vous conseille de lire. Il existe d’ailleurs une publication datant de 2018 qui est facile à trouver, sur le site en ligne de la FNAC par exemple.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *