Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/09/2011, à 14:32

Near3

Précision des doubles en C

Bonjour, je suis sous Ubuntu et j'utilise Geany pour faire du C.
Je travaille avec une précision de 6 chiffres et je me demandais comment faire pour avoir davantage de précision, je suis quasiment certain d'avoir travaillé avec 8 chiffres quand j'étais sous Windows avec ce même ordinateur.

De plus, si j'écris:

double a = .000001;
printf ("%f\n", a/3);
return 0;

On m'affichera 0.000000 à chaque fois... Ce qui est navrant car il n'y a guère qu'un chiffre utile dans a...
Help ! Si je ne suis pas dans la bonne partie du forum, dites-le moi !

Hors ligne

#2 Le 23/09/2011, à 14:48

mjdon

Re : Précision des doubles en C

C'est l’affichage qui est différent. Un double est un nombre à virgule flotante. Il a la même précision relative si tu y stock 10^10, 1 ou 10^-10. Je te laisse voir avec les rois de printf pour afficher ton nombre correctement.

Dernière modification par mjdon (Le 23/09/2011, à 14:48)

Hors ligne

#3 Le 23/09/2011, à 14:59

Near3

Re : Précision des doubles en C

Exact c'est un problème d'affichage, voici un programme que j'ai compilé :

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

int main(int argc, char **argv)
{
    double a = 1., b = 0.;
    int c = 0;
    
    while (b != a)
    {
        c++;
        b = a + pow(10, -c);
    }
        
    printf("L'ordinateur considère que 1 et 1 + 10^%u sont égaux.", c);
    return 0;
}

Voici ce qui s'est affiché : L'ordinateur considère que 1 et 1 + 10^16 sont égaux.
Donc j'aimerais bien savoir comment forcer mon ordinateur à afficher 16 décimales à chacun de mes doubles, en partant du premier chiffre non nul "à gauche".
Y-a-t-il une chance pour moi de travailler avec plus de 16 chiffres en précison ou bien est-ce quelque chose propre à l'un des composants de mon ordinateur et donc pas modifiable ?

Dernière modification par Near3 (Le 23/09/2011, à 15:14)

Hors ligne

#4 Le 23/09/2011, à 15:14

mjdon

Re : Précision des doubles en C

http://www.cplusplus.com/reference/clib … io/printf/
Pour augmenter la précision: printf("%.10f\n", d);
Ou sinon un affichage qui est tout a fait adapté aux nombres a virgule flottante: printf("%e\n", d);

Dernière modification par mjdon (Le 23/09/2011, à 15:19)

Hors ligne

#5 Le 23/09/2011, à 15:54

pingouinux

Re : Précision des doubles en C

Bonjour,
En déclarant a et b en long double, et en utilisant powl, on arrive à ceci :
L'ordinateur considère que 1 et 1 + 10^-20 sont égaux.
(Mon ordi est un 64 bits)
Cordialement

Hors ligne

#6 Le 23/09/2011, à 16:07

Near3

Re : Précision des doubles en C

Merci mjdon pour ce lien assez intéressant, mais je remarque qu'aucun specifier n'écrira 1. + e-15 sous la forme 1.000000000000001 mais arrondira lors de l'affichage, à moins d'avoir mal compris. sad

Merci également à pingouinux, j'obtiens moi aussi le chiffre 20 en remplaçant par ce que tu as suggéré! Quelle astuce diabolique ^^' j'y songerai à l'avenir smile

Hors ligne

#7 Le 23/09/2011, à 17:47

mjdon

Re : Précision des doubles en C

Après, pour quelle application à tu besoin de plus de 15 chiffres significatifs? Ça peut devenir un problème en calcul numérique lorsque l'on fait des intégrales ou de longues sommes. Mais si c'est le cas, ce n'est pas dit que 19 chiffres significatifs résolvent ton problème.
Quelques infos ici pour la curiosité (ou pour connaitre très précisément les limites de chaque type): http://fr.wikipedia.org/wiki/Virgule_flottante

Hors ligne

#8 Le 23/09/2011, à 20:06

Near3

Re : Précision des doubles en C

mjdon a écrit :

Après, pour quelle application à tu besoin de plus de 15 chiffres significatifs? Ça peut devenir un problème en calcul numérique lorsque l'on fait des intégrales ou de longues sommes. Mais si c'est le cas, ce n'est pas dit que 19 chiffres significatifs résolvent ton problème.
Quelques infos ici pour la curiosité (ou pour connaitre très précisément les limites de chaque type): http://fr.wikipedia.org/wiki/Virgule_flottante

Je n'ai vu qu'après avoir posté mon dernier message mais j'aime l'astuce que tu m'as donnée :

printf("%.20f\n", d);

Je crois que je vais l'utiliser lorsque j'en ai besoin. A vrai dire j'avais besoin d'une plus grande précision dans les calculs car j'aime zoomer l'ensemble de Mandelbrot comme un malade^^ et j'aime afficher les bornes du rectangle dans lequel je trace l'image. Mais je ne pouvais pas afficher des bornes avec plus de 6 chiffres significatifs, d'où mon problème. Merci pour le lien.

Hors ligne