Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme de calculs sur arduino nano

Mauvais resultat d'une division ou multiplic par les puissances de 10

    7 juin 2024 à 14:18:01

    Salut! j'ai un soucis de calculs avec arduino uno; en fait je fais des calculs de distances géospatiales et une division par exemple de 1.0 par 1000.0 me donne 0.001000000119209 au lieu de 0.001 pour une multiplication de 1.0 par 0.001. la fonction pow(10,-3) me renvoie 0.001000000119209 au lieu de 0.001 et pow(10,-7) me renvoie 0.000000099999990 au lieu de 0.0000001. Quel peut etre le problème svp et comment le resoudre? merci d'avance

    -
    Edité par sdz23 7 juin 2024 à 14:25:22

    • Partager sur Facebook
    • Partager sur Twitter

    La médiocrité est le début de l'excellence et la perfection, l'aboutissement de la sagesse!!!

      7 juin 2024 à 20:20:07

      Salut,


      Dans le doute: regarde https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html (What Every Computer Scientist Should Know About Floating-Point Arithmetic)

      Aussi, les floats n'ont une précision de 107 chiffres. Autant pour dire que pour travailler avec des coordonnées cartésiennes, la précision n'est plus que du mètre...

      EDIT-PS: après il y a encore les sujets des pertes de précisions sur des produits scalaires. Ce qui a aboutit à des fonctions dédiées dans la lib Java Hypparchus, réutilisée ensuite dans Orekit. Mais ta problématique me semble se poser bien en amont: peu de nombres de IR sont exactement représentables en flottants. Et j'ai un fort soupçon de floats au lieu de doubles.

      -
      Edité par lmghs 8 juin 2024 à 3:41:27

      • Partager sur Facebook
      • Partager sur Twitter
      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
        8 juin 2024 à 2:11:38

        Je me suis amusé à faire un petit test avec des float ou des doubles et ça fait toute une différence.

        Selon la norme IEEE, un float a une mantisse de 23 bits, soit au maximum 7 chiffres décimaux.

        Il y a deux choses:

        + la division par autre chose qu'une puissance de 2 introduit forcément une erreur de précision.

        + la reconversion en décimal en introduit une autre, surtout si on demande une précision trop grande.

        (faut pas en demander plus que l'ordi peut en donner).

        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          10 juin 2024 à 17:37:15

          lmghs a écrit:

          Salut,


          Dans le doute: regarde https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html (What Every Computer Scientist Should Know About Floating-Point Arithmetic)

          Aussi, les floats n'ont une précision de 107 chiffres. Autant pour dire que pour travailler avec des coordonnées cartésiennes, la précision n'est plus que du mètre...

          EDIT-PS: après il y a encore les sujets des pertes de précisions sur des produits scalaires. Ce qui a aboutit à des fonctions dédiées dans la lib Java Hypparchus, réutilisée ensuite dans Orekit. Mais ta problématique me semble se poser bien en amont: peu de nombres de IR sont exactement représentables en flottants. Et j'ai un fort soupçon de floats au lieu de doubles.

          -
          Edité par lmghs 8 juin 2024 à 3:41:27



          • Partager sur Facebook
          • Partager sur Twitter

          La médiocrité est le début de l'excellence et la perfection, l'aboutissement de la sagesse!!!

            10 juin 2024 à 20:54:17

            Tu m'as cité, mais sans rien dire -- vive la super ergonomie de la boite de réponse?
            • Partager sur Facebook
            • Partager sur Twitter
            C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

            Probleme de calculs sur arduino nano

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown