• [^] # Re: 90% des calculs ne servent à rien

    Posté par (site web personnel) . En réponse au message Je veux bien que JavaScript soit optimisé, mais quand même !.... Évalué à 2.

    Oui ce n'est ni efficace ni précis, encore moins avec les limites physiques du codage interne des virgules flottantes et des entiers, de plus très vite le 4i2/(4i2-1) devient indiscernable de 1.

    C'est juste un classique du grand oral de bac, que j'ai pris comme prétexte vu sa petite taille et sa simplicité, pour ressortir le langage C et voir si JavaScript est réellement aussi optimisé qu'on le dit.

    Ce qui manifestement vrai, au moins là dessus, puisque je n'ai jamais dépassé les quelques % d'écart, ce qui ne manque pas de m'impressionner.

    Les dernières versions avec les remarques apportées ici par tous :

    Langage C :

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    double now(){
     struct timespec t;
     clock_gettime(CLOCK_MONOTONIC, &t);
     return t.tv_sec + t.tv_nsec /1000000000.;
    }
    double wallis(unsigned long n){
     double a = 2;
     unsigned long i = 1;
     double t = now();
     for(unsigned long b = 10; b<=n; b*=10){
     for(; i<=b ; i++){
     a *= 4.*i*i/(4*i*i-1);
     }
     double t2 = now();
     printf("%.16f, time=%.3fs\n", a, (t2-t));
     t = t2;
     }
     return a;
    }
    int main(){
     printf("%.16f\n",wallis(pow(10,9)));
     return 0;
    }

    JavaScript :

    function wallis(n){
     let a=2.0;
     let i=1;
     let t = performance.now();
     for(let b=10; b<=n; b*=10){
     for(; i<=b ; i++){
     a *= ((4.0*i**2)/(4*i**2-1));
     }
     let t2 = performance.now();
     console.log(a, ", time=", (t2-t)/1000.);
     t = t2;
     }
     return a;
    }