C, décimal

Discutez d'informatique ici !
nee-san
Membre Irrationnel
Messages: 1220
Enregistré le: 04 Sep 2010, 20:23

C, décimal

par nee-san » 30 Nov 2011, 21:07

bonsoir, alors j'ai fait une petit programme en C qui calcule un nombres,
mais il m'affiche que quelque chiffre apres la virgule, comment faire pour en avoir plus?



Avatar de l’utilisateur
Olympus
Membre Irrationnel
Messages: 1668
Enregistré le: 12 Mai 2009, 11:00

par Olympus » 30 Nov 2011, 21:35

Salut !

Au lieu de %f tu mets tout simplement %.Nf en remplaçant N par le nombre de chiffres que tu souhaites voir après la virgule.

nee-san
Membre Irrationnel
Messages: 1220
Enregistré le: 04 Sep 2010, 20:23

par nee-san » 30 Nov 2011, 21:59

Olympus a écrit:Salut !

Au lieu de %f tu mets tout simplement %.Nf en remplaçant N par le nombre de chiffres que tu souhaites voir après la virgule.

merci de ton aide, j'ai finalement réussit, mais pourquoi dans le nombre que je veut les décimal,
ca me met par exemple, 1.452145456452445000000000000000000000000000000000000000000
et y a que des 0 or normalement il y a pas que des 0.

sinon encore merci de ton aide qui ma permis de resoudre mon soucis

fesssstif
Membre Naturel
Messages: 19
Enregistré le: 28 Oct 2011, 22:22

par fesssstif » 01 Déc 2011, 11:20

salut,
ça dépend du format du nombre que tu calcules,
un nombre flottant classique comme un "float" ou un "double" ne contient pas la valeur exacte
de ton nombre, il le tronque pour pouvoir le faire tenir dans l'espace de mémoire qui lui est alloué.
Ici tu lui demande d'afficher plus de chiffre que sa précision, par défaut il affichera des zéros derrière.

tu peux aller voir ce lien de wikipedia sur la norme de stockage des flottants en informatique.
http://fr.wikipedia.org/wiki/IEEE_754

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 01 Déc 2011, 11:38

salut,

enfin un float c'est quand meme plus precis que
1.452145456452445 soit environ 10^-16

c'est quoi le calcul sur le float?
la vie est une fête :)

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 01 Déc 2011, 12:03

Bonjour,
En C, il existe deux types de variables en virgule flottante, les float qui ont une précision de 7 chiffres significatifs et sont définis sur l'intervalle 3.4 10^-38 à 3.4 10^38
des double qui ont une précision de 15 chiffres significatifs et sont définis sur l'intervalle 1.7 10^-308 à 1.7 10^308.
Pour être exhaustif, il y a aussi les long double, que je déconseille.

Si on veut obtenir de nombres avec beaucoup de chiffres, il faut utiliser des bibliothèques spéciales.
Par ailleurs, par curiosité, quand pouvez-vous avoir besoin de nombres avec autant de chiffres significatifs ?

nee-san
Membre Irrationnel
Messages: 1220
Enregistré le: 04 Sep 2010, 20:23

par nee-san » 01 Déc 2011, 12:09

Dlzlogic a écrit:Bonjour,
En C, il existe deux types de variables en virgule flottante, les float qui ont une précision de 7 chiffres significatifs et sont définis sur l'intervalle 3.4 10^-38 à 3.4 10^38
des double qui ont une précision de 15 chiffres significatifs et sont définis sur l'intervalle 1.7 10^-308 à 1.7 10^308.
Pour être exhaustif, il y a aussi les long double, que je déconseille.

Si on veut obtenir de nombres avec beaucoup de chiffres, il faut utiliser des bibliothèques spéciales.
Par ailleurs, par curiosité, quand pouvez-vous avoir besoin de nombres avec autant de chiffres significatifs ?

car, j'aif ait un programme avec la formule qui donne une valeur de plus en plus proche de s, et le programme m'affiche les valeur succecifs, mais je veut plus de décimal que 16

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 01 Déc 2011, 12:27

Bon alors il y a deux solutions
1- vous trouver cette bibliothèque qui donne le nombre de chiffres significatifs désirés, à mon avis sans intérêt.
2- il s'agit d'un exercice et par exemple l'utilisation du développement en serie pourrait être une bonne méthode.
Je suis curieux, comment calculez-vous sqrt(2) ? J'ai déjà calculé sqrt(N), mais mon objectif était au contraire de limiter le nombre de chiffres significatifs.

nee-san
Membre Irrationnel
Messages: 1220
Enregistré le: 04 Sep 2010, 20:23

par nee-san » 01 Déc 2011, 12:37

Dlzlogic a écrit:Bon alors il y a deux solutions
1- vous trouver cette bibliothèque qui donne le nombre de chiffres significatifs désirés, à mon avis sans intérêt.
2- il s'agit d'un exercice et par exemple l'utilisation du développement en serie pourrait être une bonne méthode.
Je suis curieux, comment calculez-vous sqrt(2) ? J'ai déjà calculé sqrt(N), mais mon objectif était au contraire de limiter le nombre de chiffres significatifs.

ba avec la formule sqr{2} = 0.5(x+2/x)
et le resultat, par exemple pour x=1 qui est 1.5, je remplace x a chaque fois par le résultat,

et dans mon programme , je les appelée x1. et il m'affiche les valeurs successifs de x1 mais j'ai que 16 décimal puis que des 0.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 01 Déc 2011, 12:43

oui, ça j'avais compris.
Mais ma question, pourquoi avez-vous besoin de plus de 15 décimales ?
1- pour une étude particulière qui ne me regarde pas
2- pour un exo posé par un prof,
3- parce que l'informatique c'est même pas fichu de calculer une valeur quelle que j'en ai envie
4- autre raison ...

nee-san
Membre Irrationnel
Messages: 1220
Enregistré le: 04 Sep 2010, 20:23

par nee-san » 01 Déc 2011, 13:15

Dlzlogic a écrit:oui, ça j'avais compris.
Mais ma question, pourquoi avez-vous besoin de plus de 15 décimales ?
1- pour une étude particulière qui ne me regarde pas
2- pour un exo posé par un prof,
3- parce que l'informatique c'est même pas fichu de calculer une valeur quelle que j'en ai envie
4- autre raison ...

ah j'avais mal compris la question désolée,

en vue d'un tpe, j'ai fait moi même un programme, et j'ai besoin d'avoir plus de décimal si possible, mais si c'est pas possible, les 15 décimal que j'ai me suffirons

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 01 Déc 2011, 13:36

Bon, alors il y a le long double 19 chiffres significatifs de 3.4 10^-4932 à 1.1 10^4932.
Mais pour l'impression, il faut avoir le détail des formats de printf sous la main, essayer "%0.19Lf".
Je n'ai toujours pas compris pourquoi vous avez "besoin" de tant de précision.
A mon avis, il faut déjà une bonne raison pour travailler en double au lieu du float.

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 01 Déc 2011, 15:22

salut,

A mon avis, il faut déjà une bonne raison pour travailler en double au lieu du float.

non c'est plutot le contraire.


en vue d'un tpe, j'ai fait moi même un programme, et j'ai besoin d'avoir plus de décimal si possible, mais si c'est pas possible, les 15 décimal que j'ai me suffirons

Au temps pour moi jai dit une connerie avant. D'apres ce lien un float c'est 6 a 7 chiffres apres la virgule, et 15 a 16 pour un double!
la vie est une fête :)

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 01 Déc 2011, 15:48

Bonjour fatal_error,
Je clame toujours haut et fort que l'informatique est un outil de calcul très évolué, mais il reste un outil.

Avant, on faisait généralement les calculs avec 5 chiffres significatifs. Le type float nous en fournit 7. Ma conclusion est logique : "il faut une bonne raison pour travailler en double".
Les machines ont tout de même des limites, le double prend deux fois plus de place que le float.
Dans mon domaine, après avoir longtemps et soigneusement réfléchi, je travaille en long int. C'est à dire que j'utilise le même espace mémoire que le float, mais je gagne à peu près 2 chiffres.
Evidemment, je peux développer mon argumentation.

fesssstif
Membre Naturel
Messages: 19
Enregistré le: 28 Oct 2011, 22:22

par fesssstif » 01 Déc 2011, 16:10

Salut, quelle qu'en soit la raison, si tu souhaites calculer avec plus de précision
tu as plusieurs solutions :
-utiliser une librairie qui te donne des outils avec une très grande précisions
-si tu t'y connais un peu plus en programmation, tu peux le coder toi même
(dans un langages objet ça sera plus facile)
tu crées une classe qui contient un tableau de décimale et tu code toi même la division/multiplication avec la précision que tu veux, ça demande un peu plus de travaille et une meilleur connaissance de la programmation.
-il doit surement exister des logiciel de calcule qui intègrent déjà cette possibilité, comme matlab pour ne citer que lui. ton école possède peut être ce logiciel ? mais la prise en main est complexe.

Personnellement je le coderai moi même, mais c'est parce que je connais la programmation.

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 01 Déc 2011, 17:04

Les machines ont tout de même des limites, le double prend deux fois plus de place que le float.

C'est pas parce que ca prend deux fois plus de place que c'est deux fois plus long en temps calcul!

Tout depend de ce que tu veux faire, mais dans la grande majorite des cas, tu ne perds rien a mettre un double.

Apres pour etre franc, pour tous mes petits projets de merde, jmets des float parce que c'est une lettre de moins a taper... et que j'ai pris la salle habitude de croire que les float c'est plus efficace que les doubles car moins grand.

edit: apres reflexion en fait jutilise un bon vieux typedef Scalar, qui pour l'instant me convient pas trop mal sauf avec gsl qui a des signatures de merde (vu que c'est du C)
la vie est une fête :)

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 01 Déc 2011, 17:46

J'avoue ne jamais avoir testé la différence de temps d'exécution entre le float et le double, mais je serais prêt à parier que ce n'est pas le même. Il est probable qu'il est plus long de traiter 64 bits que 32 bits.
Dans mon choix, je pense surtout au stockage, gestion mémoire etc.
Je ne connais pas ce typedef Scalar, mon compilateur non plus, de quoi s'agit-il ?

Il faut aussi éviter de faire la confusion entre "nombre de chiffres après la virgule" et "nombre de chiffres significatifs".

Le n'ai pas bien compris où en voulait en venir l'auteur du lien que tu as cité. Il imprime toujours le même nombre (cad même précision). Je crois savoir pourquoi, le format utilisé est "%lf". Le modificateur "l" attend un long en entrée. Le format "%f" imprime aussi bien le float que le double.

Mes questions "pourquoi utiliser du double" et "pourquoi 15 chiffres significatifs pour calculer racine(2)" restent en suspens.
(à l'occasion, dis pas trop de mal du C, il y en a beaucoup qui l'utilisent et s'en portent fort bien.)

nee-san
Membre Irrationnel
Messages: 1220
Enregistré le: 04 Sep 2010, 20:23

par nee-san » 01 Déc 2011, 17:52

merci à tous de vos réponses, parce que je veut plus de précision si possible, mais 15 me suffise aussi.

ok je vais voir dans la librairie merci à tous

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 01 Déc 2011, 19:19

J'avoue ne jamais avoir testé la différence de temps d'exécution entre le float et le double, mais je serais prêt à parier que ce n'est pas le même. Il est probable qu'il est plus long de traiter 64 bits que 32 bits.

Je n'ai pas testé non plus, mais j'ai lu chez stack qu'avec les CPU récents, il n'y a aucune différence. Quand bien même il y en aurait une (par exemple sur la carte graphique) je pense pas qu'il soit plus important de privilégier l'erreur d'arrondi au temps CPU. A côté, une simple alloc...

Dans mon choix, je pense surtout au stockage, gestion mémoire etc.

Ben un float ou un double dans la stack, ca change pas grand chose lol. Et si yen a bcp il vaut peut-être mieux passer dans la heap...sous risque d'overflow

Je ne connais pas ce typedef Scalar, mon compilateur non plus, de quoi s'agit-il ?

J'entendais un truc rustique comme
typedef float Scalar;
Et donc on utilise Scalar à la place de float, et un bon jour si on change d'avis on utilise typedef double Scalar;

Il faut aussi éviter de faire la confusion entre "nombre de chiffres après la virgule" et "nombre de chiffres significatifs".

C'est quasi pareil. La différence n'impacte pas le raisonnement. Mais bon oui ok.
Le n'ai pas bien compris où en voulait en venir l'auteur du lien que tu as cité. Il imprime toujours le même nombre (cad même précision). Je crois savoir pourquoi, le format utilisé est "%lf". Le modificateur "l" attend un long en entrée. Le format "%f" imprime aussi bien le float que le double.

Je me suis pas arrêter à ce détail, c'était simplement pour montrer la précision (a peu pres) des floats et double.

Mes questions "pourquoi utiliser du double" et "pourquoi 15 chiffres significatifs pour calculer racine(2)" restent en suspens.

Dans l'absolu comme dit plus haut, double c'est mieux tout simplement parce que c'est plus précis, que la mémoire n'est plus un problème à l'heure actuelle et que le temps que tu perds (à supposer que tu en perdes) est négligeable.
Je parle dans la majorité des cas. Par contre oui, pourquoi autant de précision, je sais pas, et je peux pas savoir pour nee-san lol

(à l'occasion, dis pas trop de mal du C, il y en a beaucoup qui l'utilisent et s'en portent fort bien.)

Je bannis pas le C, je dis que les signatures de gsl peuvent pas etre indépendante du type en argument car pas de template.
la vie est une fête :)

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 01 Déc 2011, 19:58

Ben un float ou un double dans la stack, ca change pas grand chose lol. Et si yen a bcp il vaut peut-être mieux passer dans la heap...sous risque d'overflow
Je vais juste répondre sur ce point.
Quand j'ai commencé ma nouvelle version de mon programme, il y un peu plus de 10 ans, j'ai réfléchi à ce choix float ou double.
Mon programme a considérablement évolué depuis 10 ans et je n'ai jamais eu à revenir sur des choix que j'avais faits. Il n'est arrivé de travailler avec des fichiers assez énormes, 100 000 points en XYZ, plus tous le dessin, c'est à dire des lignes et des objets.
Les questions relatives à la précision, je connais, et un supplément de précision n'apporte rien. L'important est de savoir ce qu'on veut faire.
Je préfère insister sur ces points, parce que je sais que des jeunes développeurs ont tendance à en vouloir plus que nécessaire, ce qui explique mes questions répétées à nee-san.
Cette librairie avec des nombres énormes n'est utile que dans des cas très particulier du type "test de machine".

Il m'est arrivé de faire des test de rapidité sur des points particuliers (de tête, différence entre printf et les fonctions de ios). Ces résultats sont assez étonnants, je crois me souvenir de cas où le rapport était de 1 à 2.

Bonne soirée.

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 6 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite