5. Exemple de notebook avec C

5.1. Explications

Le kernel C n’est pas installé par défaut avec Jupyter.

Il faut installer jupyter-c-kernel

5.2. Exemples

#include <stdio.h>

int main(int argc, char* argv) {
    printf("\nHello world from C from Jupyter notebook!");
}
Hello world from C from Jupyter notebook!

5.3. Factorielle

Pour calculer la fonction \(n! := 1 \times 2 \times \dots \times n\) (\(n\in\mathbb{N}\)), on peut penser à une solution récursive (qui coutera en espace mémoire à cause de la pile d’appel) et une solution impérative.

#include <stdio.h>
#define MAX_I 15

int factorielle_rec(int n) { 
    if (n <= 1) {
        return 1;
    }
    else {
        return n * factorielle_rec(n - 1);
    }
}

int factorielle_imp(int n) {
    int f = 1;
    for (int i = 1; i <= n; i++) {
        f = f * i;  /* f *= i aussi possible*/
    }
    return f;
}

int main(int argc, char* argv) {
    for (int i = 1; i <= MAX_I+2; i++) {
        printf("\n  factorielle_rec(%d) = %d et factorielle_imp(%d) = %d", i, factorielle_rec(i), i, factorielle_imp(i));
        if (i == MAX_I) {
            printf("\nValeurs fausses après %i", MAX_I);
        }
    }
}
  factorielle_rec(1) = 1
  factorielle_rec(2) = 2
  factorielle_rec(3) = 6
  factorielle_rec(4) = 24
  factorielle_rec(5) = 120
  factorielle_rec(6) = 720
  factorielle_rec(7) = 5040
  factorielle_rec(8) = 40320
  factorielle_rec(9) = 362880
  factorielle_rec(10) = 3628800
  factorielle_rec(11) = 39916800
  factorielle_rec(12) = 479001600
  factorielle_rec(13) = 1932053504
  factorielle_rec(14) = 1278945280
  factorielle_rec(15) = 2004310016
Valeurs fausses après 15
  factorielle_rec(16) = 2004189184
  factorielle_rec(17) = -288522240

Comme on le voit, les valeurs deviennent fausses dès que \(i\geq16\). On peut augmenter la précision en utilisant des long au lieu d”int, qui utilisent (sur ma machine) 64 bits au lieu de 32 bits.

Par contre, passer à des long long n’apporterait rien (sur ma machine).

#include <stdio.h>
#define MAX_I 20

long factorielle_rec(long n) { 
    if (n <= 1) {
        return 1;
    }
    else {
        return n * factorielle_rec(n - 1L);
    }
}

long factorielle_imp(long n) {
    long f = 1;
    for (int i = 1; i <= n; i++) {
        f = f * i;  /* f *= i aussi possible*/
    }
    return f;
}

int main(int argc, char* argv) {
    for (long i = 1; i <= MAX_I+2; i++) {
        printf("\n  factorielle_rec(%li) = %li et factorielle_imp(%li) = %li", i, factorielle_rec(i), i, factorielle_imp(i));
        if (i == MAX_I) {
            printf("\nValeurs fausses après %d", MAX_I);
        }
    }
}
  factorielle_rec(1) = 1 et factorielle_imp(1) = 1
  factorielle_rec(2) = 2 et factorielle_imp(2) = 2
  factorielle_rec(3) = 6 et factorielle_imp(3) = 6
  factorielle_rec(4) = 24 et factorielle_imp(4) = 24
  factorielle_rec(5) = 120 et factorielle_imp(5) = 120
  factorielle_rec(6) = 720 et factorielle_imp(6) = 720
  factorielle_rec(7) = 5040 et factorielle_imp(7) = 5040
  factorielle_rec(8) = 40320 et factorielle_imp(8) = 40320
  factorielle_rec(9) = 362880 et factorielle_imp(9) = 362880
  factorielle_rec(10) = 3628800 et factorielle_imp(10) = 3628800
  factorielle_rec(11) = 39916800 et factorielle_imp(11) = 39916800
  factorielle_rec(12) = 479001600 et factorielle_imp(12) = 479001600
  factorielle_rec(13) = 6227020800 et factorielle_imp(13) = 6227020800
  factorielle_rec(14) = 87178291200 et factorielle_imp(14) = 87178291200
  factorielle_rec(15) = 1307674368000 et factorielle_imp(15) = 1307674368000
  factorielle_rec(16) = 20922789888000 et factorielle_imp(16) = 20922789888000
  factorielle_rec(17) = 355687428096000 et factorielle_imp(17) = 355687428096000
  factorielle_rec(18) = 6402373705728000 et factorielle_imp(18) = 6402373705728000
  factorielle_rec(19) = 121645100408832000 et factorielle_imp(19) = 121645100408832000
  factorielle_rec(20) = 2432902008176640000 et factorielle_imp(20) = 2432902008176640000
Valeurs fausses après 20
  factorielle_rec(21) = -4249290049419214848 et factorielle_imp(21) = -4249290049419214848
  factorielle_rec(22) = -1250660718674968576 et factorielle_imp(22) = -1250660718674968576

5.3.1. D’autres exemples ?

TODO: plus tard !

5.4. Pour en apprendre plus