C, trattare numeri con N decimali

di il
4 risposte

C, trattare numeri con N decimali

Volevo saggiare quanti decimali vengono valutati in C, con il mio compilatore gcc.
ho scritto questo codice:

#include<stdio.h>

int main()
{
   long double ldPI=3.141592653589793238462643383;
   double dPI=3.141592653589793238462643383;
   
   printf("%d\n", sizeof(double));
   printf("%d\n", sizeof(long double));
   
   printf("\n%.*f",27, dPI);
   printf("\n%.*Lf",27, ldPI);
   printf("\n%s\n","3.141592653589793238462643383");
}
il numero che ho preso per test è il pi greco con 27 cifre decimali, il programma restituisce:

8
12

3.141592653589793115997963469
3.141592653589793238512808959
3.141592653589793238462643383
il double ha 15 cifre decimali esatte
il long double 18 cifre decimali esatte

c'è un modo per avere una precisione più di un long double?
non ho trovato in C come si dichiara una variabile float32 o float64

quando imposto un calcolo es: sin(6) come posso imporre la precisione del calcolo interno?
se scrivo:

#include<stdio.h>
#include<math.h>

int main()
{
   printf("%d\n", sizeof(double));
   printf("%d\n", sizeof(long double));

   double d = sin(6);
   printf("\nSin(6) double   %.*f",60, d);
   long double ld = sin(6);
   printf("\nSin(6) longdoub %.*Lf",60, ld);
   printf("\nSin(6) esatto   %s","-0,27941549819892587281155544661189");
}
come risultato ho:

8
12

Sin(6) double   -0.279415498198925860151575761847198009490966796875000000000000
Sin(6) longdoub -0.279415498198925860151575761847198009490966796875000000000000
Sin(6) esatto   -0,27941549819892587281155544661189
16 cifre decimali esatte, sembra che il calcolo sia fatto in double, e cosa rappresentano i decimali oltre il 16esimo?

4 Risposte

  • Re: C, trattare numeri con N decimali

    Float è a 32 e double è a 64 bit.

    Per andare oltre c'è gmp che è lo standard de facto.

    https://en.m.wikipedia.org/wiki/GNU_Multiple_Precision_Arithmetic_Library

    Io solitamente uso gli int64_t e gestisco la precisione a mano.
  • Re: C, trattare numeri con N decimali

    GMP risulta come libreria presente nel mio MinGW, ma se eseguo l'esempio:
    
    #include <stdio.h>
    #include <gmp.h>
    
    int main(void) {
      mpz_t x, y, result;
    
      mpz_init_set_str(x, "7612058254738945", 10);
      mpz_init_set_str(y, "9263591128439081", 10);
      mpz_init(result);
    
      mpz_mul(result, x, y);
      gmp_printf("    %Zd\n"
                 "*\n"
                 "    %Zd\n"
                 "--------------------\n"
                 "%Zd\n", x, y, result);
    
      /* free used memory */
      mpz_clear(x);
      mpz_clear(y);
      mpz_clear(result);
    
      return 0;
    }
    
    tutte le istruzione mpz_... e gmp_... danno errore: undefined reference to '__gmpz....'
    in gmp.h le istruzioni che danno errore ci sono e sembra che i paramatri passati siano giusti!
    qualche idea del perché?
    grazie.
  • Re: C, trattare numeri con N decimali

    Io ho Netbeans+MinGW (anche se sono passato a Cygwin) e mi ero bloccato una settimana nello stesso punto: devi aggiungere le option -lgmpxx -lgmp nel linker, e non nel compiler (devono stare in fondo nella riga di comando della compilazione). Se hai un altro IDE immagino che l'inghippo sia lo stesso
  • Re: C, trattare numeri con N decimali

    Weierstrass ha scritto:


    Io ho Netbeans+MinGW (anche se sono passato a Cygwin) e mi ero bloccato una settimana nello stesso punto: devi aggiungere le option -lgmpxx -lgmp nel linker, e non nel compiler (devono stare in fondo nella riga di comando della compilazione). Se hai un altro IDE immagino che l'inghippo sia lo stesso
    uso CODE::BLOCKS, inserite nel Linker Setting/Other linker option, i due flag -lgmpxx e -lgmp, e l'esempio funziona perfettamente, grazie

    risultato in console:
    
        7612058254738945
    *
        9263591128439081
    --------------------
    70514995317761165008628990709545
    
Devi accedere o registrarti per scrivere nel forum
4 risposte