CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Langage C problème de précision float

HulkDu92
HulkDu92
Niveau 10
15 septembre 2021 à 18:42:53

Bonjour je fais le calcul suivant que je stock dans un float
1e-9+1e9

Et lorsque j'affiche le résultat à 10 chiffres après la virgule cela arrondi la fin à 0
J'obtiens donc 1 000 000 000.000 000 00'''0'''
Alors que je veux 1 000 000 000.000 000 00'''1'''

On me demande de proposer une solution pour obtenir le résultat correct sauf que je ne trouves rien sur le net qui pourrait me mettre sur la piste
Des idées ? :(

[JV]orgha
[JV]orgha
Niveau 9
15 septembre 2021 à 19:11:30

Tu as double et long double comme type de variables qui te permettent de stocker un nombre à virgule flottante avec plus de précision

ChibreMusque2
ChibreMusque2
Niveau 8
15 septembre 2021 à 19:12:01

ça fait longtemps que je me suis pas plongé dans ce genre de truc, mais vas jeter un œil à la norme IEEE 754, quantization etc.. une fois que t'auras compris comment ça marche transpose avec les types dispo en C et ça devrait aller

godrik
godrik
Niveau 30
15 septembre 2021 à 20:12:10

Ces deux nombres:

J'obtiens donc 1 000 000 000.000 000 000
Alors que je veux 1 000 000 000.000 000 001

ont la meme representation au format IEEE 754 32-bit.
Ce n'est pas une question de langage de programmation.

La seule solution possible est de change le format de representation. Une fois que tu change de format, il y en a plsueyrs qui peuvent fournir cette fonctionallite. Mais float (IEEE 754 32-bit) ne le fera jamais.

Oubasaurus
Oubasaurus
Niveau 8
15 septembre 2021 à 22:25:35

Ça me rappelle les fameux troll sur javascript 0.1 + 0.2 != 0.3 alors que ça n'a rien à voir avec le langage

godrik
godrik
Niveau 30
15 septembre 2021 à 22:51:36

Ça me rappelle les fameux troll sur javascript 0.1 + 0.2 != 0.3 alors que ça n'a rien à voir avec le langage

exactement. Alors qu'il y a tellement a dire sur javascript! :)

RegleGraduee
RegleGraduee
Niveau 70
16 septembre 2021 à 00:45:32

Le 15 septembre 2021 à 22:25:35 :
Ça me rappelle les fameux troll sur javascript 0.1 + 0.2 != 0.3 alors que ça n'a rien à voir avec le langage

J'avais le souvenir de cette exemple de la fac, j'ai un peu oublié le pourquoi du comment (j'ai souvenir que c'est une histoire de mantisse etc..), mais je viens de tester en python 3.7


>>> (0.1 + 0.2) == 0.3
False
>>> (0.1 + 0.2) != 0.3
True

Je suis quand même surpris qu'il y ai pas un workarround mis en place pour forcer une sortie correcte ? Il y a un risque d'avoir un bug ultra rare et spécifique avec ce genre de petit problème non ? :(

Message édité le 16 septembre 2021 à 00:46:30 par RegleGraduee
Oubasaurus
Oubasaurus
Niveau 8
16 septembre 2021 à 00:54:10

Le 16 septembre 2021 à 00:45:32 :

Le 15 septembre 2021 à 22:25:35 :
Ça me rappelle les fameux troll sur javascript 0.1 + 0.2 != 0.3 alors que ça n'a rien à voir avec le langage

J'avais le souvenir de cette exemple de la fac, j'ai un peu oublié le pourquoi du comment (j'ai souvenir que c'est une histoire de mantisse etc..), mais je viens de tester en python 3.7

<code>

(0.1 + 0.2) == 0.3

False

(0.1 + 0.2) != 0.3

True
</code>

Je suis quand même surpris qu'il y ai pas un workarround mis en place pour forcer une sortie correcte ? Il y a un risque d'avoir un bug ultra rare et spécifique avec ce genre de petit problème non ? :(

Non; aucun risque, chacun sait qu'on ne teste jamais l'égalité entre deux floats.
Après dans les langages non typé où tu sais pas forcément si c'est un int ou un float ça peut en surprendre plus d'un

godrik
godrik
Niveau 30
16 septembre 2021 à 01:06:42

Le 16 septembre 2021 à 00:45:32 :

Le 15 septembre 2021 à 22:25:35 :
Ça me rappelle les fameux troll sur javascript 0.1 + 0.2 != 0.3 alors que ça n'a rien à voir avec le langage

J'avais le souvenir de cette exemple de la fac, j'ai un peu oublié le pourquoi du comment (j'ai souvenir que c'est une histoire de mantisse etc..), mais je viens de tester en python 3.7

<code>

(0.1 + 0.2) == 0.3

False

(0.1 + 0.2) != 0.3

True
</code>

Je suis quand même surpris qu'il y ai pas un workarround mis en place pour forcer une sortie correcte ? Il y a un risque d'avoir un bug ultra rare et spécifique avec ce genre de petit problème non ? :(

Basiquement, il ne faut pas tester l'egalite pour des nombres a virgule flotantes (sauf dans des cas extreme). Il faut tester |a-b|<epsilon pour un epsilon qui a du sens pour ton application.

Pseudo supprimé
Pseudo supprimé 16 septembre 2021 à 08:09:58

Le 16 septembre 2021 à 00:45:32 :

Le 15 septembre 2021 à 22:25:35 :
Ça me rappelle les fameux troll sur javascript 0.1 + 0.2 != 0.3 alors que ça n'a rien à voir avec le langage

J'avais le souvenir de cette exemple de la fac, j'ai un peu oublié le pourquoi du comment (j'ai souvenir que c'est une histoire de mantisse etc..), mais je viens de tester en python 3.7

<code>

(0.1 + 0.2) == 0.3

False

(0.1 + 0.2) != 0.3

True
</code>

Je suis quand même surpris qu'il y ai pas un workarround mis en place pour forcer une sortie correcte ? Il y a un risque d'avoir un bug ultra rare et spécifique avec ce genre de petit problème non ? :(

Encore heureux que les langages fassent pas leur popote et utilisent des standards universellement reconnus, testés et étudiés :doute:

D'autant que je rappelle : python n'est pas un langage scientifique, pourquoi un langage non scientifique utiliserait des décimaux à précision arbitraire ou des rationnels plutôt que des flottants pour leurs nombres littéraux de base ?

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment