• # Haute précision

    Posté par . En réponse au journal Cohérence des fonctions d'arrondi. Évalué à 1.

    Quid de bibliothèques de haute précision ? Par exemple, GNU MPFR implémente les cinq modes d'arrondis d'IEEE754-2008.

    /* linuxfr.c */
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <mpfr.h>
    void exemplifier(mpfr_t, mpfr_rnd_t, char **, size_t);
    int main(int argc, char* argv[]) {
     mpfr_t x;
     mpfr_init2(x, 64);
     char *eleven[] = {"11.5", "-11.5"};
     char *twelve[] = {"12.5", "-12.5"};
     exemplifier(x, MPFR_RNDN, eleven, 2);
     exemplifier(x, MPFR_RNDN, twelve, 2);
     exemplifier(x, MPFR_RNDZ, eleven, 2);
     exemplifier(x, MPFR_RNDZ, twelve, 2);
     exemplifier(x, MPFR_RNDU, eleven, 2);
     exemplifier(x, MPFR_RNDU, twelve, 2);
     exemplifier(x, MPFR_RNDD, eleven, 2);
     exemplifier(x, MPFR_RNDD, twelve, 2);
     exemplifier(x, MPFR_RNDA, eleven, 2);
     exemplifier(x, MPFR_RNDA, twelve, 2);
     mpfr_clear(x);
     mpfr_free_cache();
     return 0;
    }
    void exemplifier(mpfr_t val, mpfr_rnd_t rnd, char **lit, size_t size) {
     size_t i = 0;
     fprintf(stdout, "\n");
     for(i = 0; i < size; ++i) {
     mpfr_set_str(val, lit[i], 10, rnd);
     mpfr_out_str(stdout, 10, 10, val, rnd);
     fprintf(stdout, "\t");
     }
     fprintf(stdout, "\n");
    }

    Disclaimer: n'ayant pas de grande aisance en C, je me fie au compilateur pour m'indiquer les éventuelles bourdes de ce que j'aurais commises.

    gcc -lmpfr -lgmp -std=c11 -g -O3 -Wall -pedantic -Wextra -ggdb -fomit-frame-pointer -fstack-protector-all -ftrapv -pipe -flto linuxfr.c -o linuxfr
    1.150000000e1 -1.150000000e1 
    1.250000000e1 -1.250000000e1 
    1.150000000e1 -1.150000000e1 
    1.250000000e1 -1.250000000e1 
    1.150000000e1 -1.150000000e1 
    1.250000000e1 -1.250000000e1 
    1.150000000e1 -1.150000000e1 
    1.250000000e1 -1.250000000e1 
    1.150000000e1 -1.150000000e1 
    1.250000000e1 -1.250000000e1