Problème de précision en C++
Résolu/Fermé
Anonyme1234_7288
Messages postés
64
Date d'inscription
samedi 14 mars 2020
Statut
Membre
Dernière intervention
8 avril 2021
-
Modifié le 8 mai 2020 à 18:52
Utilisateur anonyme - 10 mai 2020 à 18:52
Utilisateur anonyme - 10 mai 2020 à 18:52
A voir également:
- Problème de précision en C++
- Coordonnées gps précision - Guide
- Imprimante 3d haute précision - Guide
- Sidewinder precision 2 joystick driver windows 10 - Forum Windows 10
- Sidewinder precision 2 - Forum Logiciels
- Compteur d'événement de haute précision - Forum Logiciels
6 réponses
yg_be
Messages postés
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
Ambassadeur
1 554
9 mai 2020 à 12:27
9 mai 2020 à 12:27
bonjour,
as-tu fait une recherche "c++ precision float"?
as-tu fait une recherche "c++ precision float"?
Utilisateur anonyme
9 mai 2020 à 12:30
9 mai 2020 à 12:30
Bonjour
https://forums.commentcamarche.net/forum/affich-35846831-erreur-de-calcul#3
Voir ma réponse, puis celles de Dalfab et Reivax
https://forums.commentcamarche.net/forum/affich-35846831-erreur-de-calcul#3
Voir ma réponse, puis celles de Dalfab et Reivax
Dalfab
Messages postés
706
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
2 novembre 2023
101
9 mai 2020 à 13:38
9 mai 2020 à 13:38
Bonjour,
Le type
Je te propose donc de remplacer
Le type
floatest réservé aux cas où on n'a besoin de très peu de précision et où il faut à tout prix économiser la mémoire. Depuis 1985, le type préconisé pour les calculs flottants est le type
double, il est plus rapide (sur la plupart des processeurs) et nettement plus précis.
Je te propose donc de remplacer
floatpar
doubledans ton code. Tu n'obtiendras pas la même chose que ta calculatrice, mais ça sera peut-être mieux qu"elle. Le
floatlui n'y arrivera jamais.
Dalfab
Messages postés
706
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
2 novembre 2023
101
>
Utilisateur anonyme
9 mai 2020 à 18:20
9 mai 2020 à 18:20
Le problème est qu'il n'y pas eu de préconisation. Mais à un moment, les notations ont évolués la fonction fabs() retournait un float, et la syntaxe à évolué en :
float fabsf( float arg );
double fabs( double arg );
long double fabsl( long double arg );
Ça a été officialisé avec le C99, mais les compilateurs de l'époque avaient une option pour savoir si fabs() et autres retournaient un float ou un double.
De même pour indiquer un littéral flottant on ajoute un suffixe f, alors que le double n'en a pas besoin.
Donc le float serait alors devenu la cas particulier et le double le cas normal.
Le plus caractéristique est comment est mis un float sur la pile, il est désormais converti en double (si on donne un float à une fonction attendant un float on se prend une double conversion intermédiaire!) C'est pourquoi dans un printf() le paramètre désignant un float ou un double est désormais le même "%f".
Les processeurs de l'époque étaient même plus rapide pour les double car c'était celui qui était hardcodé. C'est moins le cas aujourd'hui avec les unités de calcul parallèles.
Ils ont gardé par contre le fait que dans un scanf, ça n'est pas le float l'exception, c'est le double qui utilise "%lf".
Alors pourquoi beaucoup de cours continuent d'utiliser les float? Je ne sais pas vraiment, mais on trouve encore des cours qui indiquent qu'on doit déclarer ses variables au début des fonctions (cf le code ci-dessus!) alors!!
PS: en fait je travaille dans l'embarqué et donc je n'utilise quasiment jamais les flottants, et si je dois je me restreint au float, car les processeurs que j'utilise n'ont pas de coprocesseurs ni d'unité flottante.
float fabsf( float arg );
double fabs( double arg );
long double fabsl( long double arg );
Ça a été officialisé avec le C99, mais les compilateurs de l'époque avaient une option pour savoir si fabs() et autres retournaient un float ou un double.
De même pour indiquer un littéral flottant on ajoute un suffixe f, alors que le double n'en a pas besoin.
Donc le float serait alors devenu la cas particulier et le double le cas normal.
Le plus caractéristique est comment est mis un float sur la pile, il est désormais converti en double (si on donne un float à une fonction attendant un float on se prend une double conversion intermédiaire!) C'est pourquoi dans un printf() le paramètre désignant un float ou un double est désormais le même "%f".
Les processeurs de l'époque étaient même plus rapide pour les double car c'était celui qui était hardcodé. C'est moins le cas aujourd'hui avec les unités de calcul parallèles.
Ils ont gardé par contre le fait que dans un scanf, ça n'est pas le float l'exception, c'est le double qui utilise "%lf".
Alors pourquoi beaucoup de cours continuent d'utiliser les float? Je ne sais pas vraiment, mais on trouve encore des cours qui indiquent qu'on doit déclarer ses variables au début des fonctions (cf le code ci-dessus!) alors!!
PS: en fait je travaille dans l'embarqué et donc je n'utilise quasiment jamais les flottants, et si je dois je me restreint au float, car les processeurs que j'utilise n'ont pas de coprocesseurs ni d'unité flottante.
Utilisateur anonyme
>
Dalfab
Messages postés
706
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
2 novembre 2023
9 mai 2020 à 19:30
9 mai 2020 à 19:30
Le plus caractéristique est comment est mis un float sur la pile, il est désormais converti en double
Oui c'est le cas en C# aussi.
Anonyme1234_7288
Messages postés
64
Date d'inscription
samedi 14 mars 2020
Statut
Membre
Dernière intervention
8 avril 2021
9 mai 2020 à 19:59
9 mai 2020 à 19:59
Bonjour,
Mais si j'ai absolument besoins que le chiffre qui va être afficher soit égal à la calculatrice, comment faire?
Mais si j'ai absolument besoins que le chiffre qui va être afficher soit égal à la calculatrice, comment faire?
Utilisateur anonyme
9 mai 2020 à 20:04
9 mai 2020 à 20:04
Tu as essayé avec des doubles?
Anonyme1234_7288
Messages postés
64
Date d'inscription
samedi 14 mars 2020
Statut
Membre
Dernière intervention
8 avril 2021
9 mai 2020 à 20:22
9 mai 2020 à 20:22
Bonjour,
Merci Whismeril, ça marche, mais maintenant, j'ai rajouté n autre bout de code et ce bout de code dois trouver l'inverse de la variable choix. Mais même si je met des doubles, ça ne change rien, la réponse afficher ne correspond pas au résultat de ma calculatrice.
Voici mon code:
Merci Whismeril, ça marche, mais maintenant, j'ai rajouté n autre bout de code et ce bout de code dois trouver l'inverse de la variable choix. Mais même si je met des doubles, ça ne change rien, la réponse afficher ne correspond pas au résultat de ma calculatrice.
Voici mon code:
#include <iostream> #include <vector> #include <algorithm> #include <math.h> #include <iomanip> #include <windows.h> #define pi 3.14159265358979323846264338328 using namespace std; int myArr[] = { 113, 111, 109, 107, 103, 103, 101, 100, 99, 98, 97, 95, 93, 93, 92, 91, 90, 89, 89, 87, 85, 83, 81, 80, 79, 77, 76, 75, 74, 73, 72, 71, 71, 70, 69, 67, 66, 65, 63, 62, 61, 60, 60, 59, 58, 57, 56, 55, 55, 53, 52, 51, 50, 50, 49, 48, 48, 47, 46, 46, 45, 45, 44, 43, 43, 42, 41, 40, 39, 37, 36, 36, 36, 36, 35, 34, 33, 32, 31, 30, 30, 29, 29, 26, 26, 25, 24, 24, 23, 22, 20, 20 }; vector <float> value{}; float ele; float ele1; float ele2; float ele3; float getClosest() { for (float ele : myArr) { for (float ele1 : myArr) { for (float ele2 : myArr) { for (float ele3 : myArr) { value.push_back((ele / ele1) * (ele2 / ele3)); } } } } return 0; } // Fin fonction pour calculer les ratios des gear // Début fonction pour connaitre la valeur la plus proche float getClosest2(float search) { float closest; closest = 0; float item; for (float item : value) { if (closest == 0 || fabs(search - closest) > fabs(item - search)) { closest = item; } } return closest; } // Fin fonction pour connaitre la valeur la plus proche int main() { // Début de l'équation pour la valeur recherche du MOD double recherche = 9.0*(sin(45*(pi/180)) / 5.8); // Fin de l'équation pour la valeur recherche du MOD // Début de la recherche de la première valeur la plus proche getClosest(); double valPlusProche = getClosest2(recherche); double tab[4][1]; for (float ele : myArr) { for (float ele1 : myArr) { for (float ele2 : myArr) { for (float ele3 : myArr) { float calc = (ele/ele1)*(ele2/ele3); if (calc == valPlusProche) { tab[0][0] = ele; tab[1][0] = ele1; tab[2][0] = ele2; tab[3][0] = ele3; tab[4][0] = (tab[0][0]/tab[1][0])*(tab[2][0]/tab[3][0]); break; } } } } } double table = tab[4][0]; // Fin de la recherche de la première valeur la plus proche // Début de l'éffacement de la première valeur la plus proche dans le tableau value double value_to_remove = valPlusProche; value.erase(std::remove(value.begin(), value.end(), value_to_remove), value.end()); // Fin de l'éffacement de la première valeur la plus proche dans le tableau value // Début de la recherche de la deuxième valeur la plus proche double valPlusProche1 = getClosest2(recherche); double tab1[4][1]; for (float ele : myArr){ for (float ele1 : myArr) { for (float ele2 : myArr) { for (float ele3 : myArr) { float calc = (ele / ele1) * (ele2 / ele3); if (calc == valPlusProche1) { tab1[0][0] = ele; tab1[1][0] = ele1; tab1[2][0] = ele2; tab1[3][0] = ele3; tab1[4][0] = (tab1[0][0]/tab1[1][0])*(tab1[2][0]/tab1[3][0]); break; } } } } } double table1 = tab1[4][0]; // Fin de la recherche de la deuxième valeur la plus proche // Début de l'éffacement de la deuxième valeur la plus proche dans le tableau value double value_to_remove1 = valPlusProche1; value.erase(std::remove(value.begin(), value.end(), value_to_remove1), value.end()); // Fin de l'éffacement de la deuxième valeur la plus proche dans le tableau value // Début de la recherche de la troisième valeur la plus proche double valPlusProche2 = getClosest2(recherche); double tab2[4][1]; for (float ele : myArr){ for (float ele1 : myArr) { for (float ele2 : myArr) { for (float ele3 : myArr) { float calc = (ele / ele1) * (ele2 / ele3); if (calc == valPlusProche2) { tab2[0][0] = ele; tab2[1][0] = ele1; tab2[2][0] = ele2; tab2[3][0] = ele3; tab2[4][0] = (tab2[0][0]/tab2[1][0])*(tab2[2][0]/tab2[3][0]); break; } } } } } double table2 = tab2[4][0]; // Fin de la recherche de la troisième valeur la plus proche // Début de l'éffacement de la troisième valeur la plus proche dans le tableau value double value_to_remove2 = valPlusProche2; value.erase(std::remove(value.begin(), value.end(), value_to_remove2), value.end()); // Fin de l'éffacement de la troisième valeur la plus proche dans le tableau value // Début de la recherche de la quatrième valeur la plus proche double valPlusProche3 = getClosest2(recherche); float tab3[4][1]; for (float ele : myArr){ for (float ele1 : myArr) { for (float ele2 : myArr) { for (float ele3 : myArr) { float calc = (ele / ele1) * (ele2 / ele3); if (calc == valPlusProche3) { tab3[0][0] = ele; tab3[1][0] = ele1; tab3[2][0] = ele2; tab3[3][0] = ele3; tab3[4][0] = (tab3[0][0]/tab3[1][0])*(tab3[2][0]/tab3[3][0]); break; } } } } } double table3 = tab3[4][0]; // Fin de la recherche de la quatrième valeur la plus proche // Début affichage des informations printf("Ratio recherch%c : %.9f\n", 130, recherche); printf("R%csultat ratio #1 : %.9f \n", 130, table); cout << "Engrenages " << tab[0][0] << ", " << tab[1][0] << ", " << tab[2][0] << " et " << tab[3][0] << endl; double sinangle = (table * 5.8)/9; double transformsin = (asin(sinangle))*180/pi; printf("Donnera un angle de %.9f\n", transformsin); cout << "=============================================================" << endl; printf("Ratio recherch%c : %.9f \n", 130, recherche); printf("R%csultat ratio #2 : %.9f \n", 130, table1); cout << "Engrenages " << tab1[0][0] << ", " << tab1[1][0] << ", " << tab1[2][0] << " et " << tab1[3][0] << endl; double sinangle1 = (table1 * 5.8)/9; double transformsin1 = (asin(sinangle1))*180/pi; printf("Donnera un angle de %.9f\n", transformsin1); cout << "=============================================================" << endl; printf("Ratio recherch%c : %.9f \n", 130, recherche); printf("R%csultat ratio #3 : %.9f \n", 130, table2); cout << "Engrenages " << tab2[0][0] << ", " << tab2[1][0] << ", " << tab2[2][0] << " et " << tab2[3][0] << endl; double sinangle2 = (table2 * 5.8)/9; double transformsin2 = (asin(sinangle))*180/pi; printf("Donnera un angle de %.9f\n", transformsin2); cout << "=============================================================" << endl; printf("Ratio recherch%c : %.9f \n", 130, recherche); printf("R%csultat ratio #4 : %.9f \n", 130, table3); cout << "Engrenages " << tab3[0][0] << ", " << tab3[1][0] << ", " << tab3[2][0] << " et " << tab3[3][0] << endl; double sinangle3 = (table3 * 5.8)/9; double transformsin3 = (asin(sinangle))*180/pi; printf("Donnera un angle de %.9f\n", transformsin3); cout << "=============================================================\n" << endl; // Fin affichage des informations }
yg_be
Messages postés
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
1 554
>
Anonyme1234_7288
Messages postés
64
Date d'inscription
samedi 14 mars 2020
Statut
Membre
Dernière intervention
8 avril 2021
Modifié le 9 mai 2020 à 21:08
Modifié le 9 mai 2020 à 21:08
peux-tu partager les valeurs affichées par l'un et l'autre?
pourquoi as-tu absolument besoin que le nombre qui va être affiché soit égal à la calculatrice? de quelle calculatrice s'agit-il?
pourquoi as-tu absolument besoin que le nombre qui va être affiché soit égal à la calculatrice? de quelle calculatrice s'agit-il?
Anonyme1234_7288
Messages postés
64
Date d'inscription
samedi 14 mars 2020
Statut
Membre
Dernière intervention
8 avril 2021
>
yg_be
Messages postés
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
9 mai 2020 à 21:30
9 mai 2020 à 21:30
J'ai besoin que le nombre soit égal à la calculatrice parce que l'opération peux s'effectuer à la main mais je crée un programme pour automatiser cette tâche et peux importe la calculatrice qu'on utilise. Mon programme, pour le premier résultat, il affiche 44.999997467 et ce pour l'inverse du sinus, et sur la calculatrice il affiche 44,999997469, mais j'ai absolument besoins qu'ils soient égal.
Merci
Merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
9 mai 2020 à 21:57
9 mai 2020 à 21:57
Tu dis que ça marche mais que ça marche pas et ton code est toujours plein de float....
Anonyme1234_7288
Messages postés
64
Date d'inscription
samedi 14 mars 2020
Statut
Membre
Dernière intervention
8 avril 2021
9 mai 2020 à 21:58
9 mai 2020 à 21:58
Donc si je comprend il faut que j'enlève tout mes float, même ceux dans les fonctions?
yg_be
Messages postés
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
1 554
>
Anonyme1234_7288
Messages postés
64
Date d'inscription
samedi 14 mars 2020
Statut
Membre
Dernière intervention
8 avril 2021
10 mai 2020 à 09:29
10 mai 2020 à 09:29
non, il ne faut pas, sauf si tu veux des résultats plus précis.
Anonyme1234_7288
Messages postés
64
Date d'inscription
samedi 14 mars 2020
Statut
Membre
Dernière intervention
8 avril 2021
>
yg_be
Messages postés
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
10 mai 2020 à 17:23
10 mai 2020 à 17:23
D'accord mais même si je les enlèves tous et que je les remplaces par des double, le résultat va encore être différent.
yg_be
Messages postés
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
1 554
>
Anonyme1234_7288
Messages postés
64
Date d'inscription
samedi 14 mars 2020
Statut
Membre
Dernière intervention
8 avril 2021
10 mai 2020 à 17:38
10 mai 2020 à 17:38
peux-tu montrer le nouveau résultat?
Anonyme1234_7288
Messages postés
64
Date d'inscription
samedi 14 mars 2020
Statut
Membre
Dernière intervention
8 avril 2021
>
yg_be
Messages postés
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
Modifié le 10 mai 2020 à 17:47
Modifié le 10 mai 2020 à 17:47
Si je retire tout les float, voici mon code :
Et le résultat du premier ratio est de l'arc du sinus est 44.999997467 sur le programme et sur la calculatrice c'est 44,99999684278048340310258988422.
#include <iostream> #include <list> #include <algorithm> #include <math.h> #include <iomanip> #include <windows.h> #define pi 3.14159265358979323846264338328 using namespace std; double myArr[] = { 113, 111, 109, 107, 103, 103, 101, 100, 99, 98, 97, 95, 93, 93, 92, 91, 90, 89, 89, 87, 85, 83, 81, 80, 79, 77, 76, 75, 74, 73, 72, 71, 71, 70, 69, 67, 66, 65, 63, 62, 61, 60, 60, 59, 58, 57, 56, 55, 55, 53, 52, 51, 50, 50, 49, 48, 48, 47, 46, 46, 45, 45, 44, 43, 43, 42, 41, 40, 39, 37, 36, 36, 36, 36, 35, 34, 33, 32, 31, 30, 30, 29, 29, 26, 26, 25, 24, 24, 23, 22, 20, 20 }; list <double> value{}; double ele; double ele1; double ele2; double ele3; double getClosest() { for (double ele : myArr) { for (double ele1 : myArr) { for (double ele2 : myArr) { for (double ele3 : myArr) { value.push_back((ele / ele1) * (ele2 / ele3)); } } } } return 0; } // Fin fonction pour calculer les ratios des gear // Début fonction pour connaitre la valeur la plus proche double getClosest2(double search) { double closest; closest = 0; double item; for (double item : value) { if (closest == 0 || abs(search - closest) > abs(item - search)) { closest = item; } } return closest; } // Fin fonction pour connaitre la valeur la plus proche int main() { // Début de l'équation pour la valeur recherche du MOD double recherche = 9*(sin(45*(pi/180)) / 5.8); // Fin de l'équation pour la valeur recherche du MOD // Début de la recherche de la première valeur la plus proche getClosest(); double valPlusProche = getClosest2(recherche); double tab[4][1]; for (double ele : myArr) { for (double ele1 : myArr) { for (double ele2 : myArr) { for (double ele3 : myArr) { double calc = (ele/ele1)*(ele2/ele3); if (calc == valPlusProche) { tab[0][0] = ele; tab[1][0] = ele1; tab[2][0] = ele2; tab[3][0] = ele3; tab[4][0] = (tab[0][0]/tab[1][0])*(tab[2][0]/tab[3][0]); break; } } } } } double table = tab[4][0]; // Fin de la recherche de la première valeur la plus proche // Début de l'éffacement de la première valeur la plus proche dans le tableau value double value_to_remove = valPlusProche; value.erase(std::remove(value.begin(), value.end(), value_to_remove), value.end()); // Fin de l'éffacement de la première valeur la plus proche dans le tableau value // Début de la recherche de la deuxième valeur la plus proche double valPlusProche1 = getClosest2(recherche); double tab1[4][1]; for (double ele : myArr){ for (double ele1 : myArr) { for (double ele2 : myArr) { for (double ele3 : myArr) { double calc = (ele / ele1) * (ele2 / ele3); if (calc == valPlusProche1) { tab1[0][0] = ele; tab1[1][0] = ele1; tab1[2][0] = ele2; tab1[3][0] = ele3; tab1[4][0] = (tab1[0][0]/tab1[1][0])*(tab1[2][0]/tab1[3][0]); break; } } } } } double table1 = tab1[4][0]; // Fin de la recherche de la deuxième valeur la plus proche // Début de l'éffacement de la deuxième valeur la plus proche dans le tableau value double value_to_remove1 = valPlusProche1; value.erase(std::remove(value.begin(), value.end(), value_to_remove1), value.end()); // Fin de l'éffacement de la deuxième valeur la plus proche dans le tableau value // Début de la recherche de la troisième valeur la plus proche double valPlusProche2 = getClosest2(recherche); double tab2[4][1]; for (double ele : myArr){ for (double ele1 : myArr) { for (double ele2 : myArr) { for (double ele3 : myArr) { double calc = (ele / ele1) * (ele2 / ele3); if (calc == valPlusProche2) { tab2[0][0] = ele; tab2[1][0] = ele1; tab2[2][0] = ele2; tab2[3][0] = ele3; tab2[4][0] = (tab2[0][0]/tab2[1][0])*(tab2[2][0]/tab2[3][0]); break; } } } } } double table2 = tab2[4][0]; // Fin de la recherche de la troisième valeur la plus proche // Début de l'éffacement de la troisième valeur la plus proche dans le tableau value double value_to_remove2 = valPlusProche2; value.erase(std::remove(value.begin(), value.end(), value_to_remove2), value.end()); // Fin de l'éffacement de la troisième valeur la plus proche dans le tableau value // Début de la recherche de la quatrième valeur la plus proche double valPlusProche3 = getClosest2(recherche); double tab3[4][1]; for (double ele : myArr){ for (double ele1 : myArr) { for (double ele2 : myArr) { for (double ele3 : myArr) { double calc = (ele / ele1) * (ele2 / ele3); if (calc == valPlusProche3) { tab3[0][0] = ele; tab3[1][0] = ele1; tab3[2][0] = ele2; tab3[3][0] = ele3; tab3[4][0] = (tab3[0][0]/tab3[1][0])*(tab3[2][0]/tab3[3][0]); break; } } } } } double table3 = tab3[4][0]; // Fin de la recherche de la quatrième valeur la plus proche // Début affichage des informations printf("Ratio recherch%c : %.7f\n", 130, recherche); printf("R%csultat ratio #1 : %.7f \n", 130, table); cout << "Engrenages " << tab[0][0] << ", " << tab[1][0] << ", " << tab[2][0] << " et " << tab[3][0] << endl; double sinangle = (table * 5.8)/9; double transformsin = (asin(sinangle))*180/pi; printf("Donnera un angle de %.9f\n", transformsin); cout << "=============================================================" << endl; printf("Ratio recherch%c : %.7f \n", 130, recherche); printf("R%csultat ratio #2 : %.7f \n", 130, table1); cout << "Engrenages " << tab1[0][0] << ", " << tab1[1][0] << ", " << tab1[2][0] << " et " << tab1[3][0] << endl; double sinangle1 = (table1 * 5.8)/9; double transformsin1 = (asin(sinangle1))*180/pi; printf("Donnera un angle de %.9f\n", transformsin1); cout << "=============================================================" << endl; printf("Ratio recherch%c : %.7f \n", 130, recherche); printf("R%csultat ratio #3 : %.7f \n", 130, table2); cout << "Engrenages " << tab2[0][0] << ", " << tab2[1][0] << ", " << tab2[2][0] << " et " << tab2[3][0] << endl; double sinangle2 = (table2 * 5.8)/9; double transformsin2 = (asin(sinangle))*180/pi; printf("Donnera un angle de %.9f\n", transformsin2); cout << "=============================================================" << endl; printf("Ratio recherch%c : %.7f \n", 130, recherche); printf("R%csultat ratio #4 : %.7f \n", 130, table3); cout << "Engrenages " << tab3[0][0] << ", " << tab3[1][0] << ", " << tab3[2][0] << " et " << tab3[3][0] << endl; double sinangle3 = (table3 * 5.8)/9; double transformsin3 = (asin(sinangle))*180/pi; printf("Donnera un angle de %.9f\n", transformsin3); cout << "=============================================================\n" << endl; // Fin affichage des informations }
Et le résultat du premier ratio est de l'arc du sinus est 44.999997467 sur le programme et sur la calculatrice c'est 44,99999684278048340310258988422.
Utilisateur anonyme
10 mai 2020 à 18:52
10 mai 2020 à 18:52
Alors je site
message du 9 mai à 21h30
message du 10 mais à 17h41
Donc la calculatrice a changé ou tu t'es trompé quelque part? Parce qu'il y a une valeur commune, mais c'est pas celle que tu attribues à la caculette.
Il faut aussi penser que printf arrondit ce qu'il affiche.
Là par exemple, tu as écrit que tu voulais 7 décimales.
Il y a peut-être un problème comme cela.
Enfin, tu dis vouloir absolument la même chose que la calculatrice, il faut quand envisager 2 choses:
message du 9 mai à 21h30
Mon programme, pour le premier résultat, il affiche 44.999997467 et ce pour l'inverse du sinus, et sur la calculatrice il affiche 44,999997469
message du 10 mais à 17h41
Et le résultat du premier ratio est de l'arc du sinus est 44.999997467 sur le programme et sur la calculatrice c'est 44,99999684278048340310258988422.
Donc la calculatrice a changé ou tu t'es trompé quelque part? Parce qu'il y a une valeur commune, mais c'est pas celle que tu attribues à la caculette.
Il faut aussi penser que printf arrondit ce qu'il affiche.
Là par exemple, tu as écrit que tu voulais 7 décimales.
printf("Ratio recherch%c : %.7f\n", 130, recherche);
Il y a peut-être un problème comme cela.
Enfin, tu dis vouloir absolument la même chose que la calculatrice, il faut quand envisager 2 choses:
- la calculatrice c'est de l'électronique, elle aussi utilise des flottants et y'a un moment où rien ne garantie que sa précision soit meilleure que ton algorithme.
- tu calcules un arcsin, avec une valeur proche de 45, je vais supposer que c'est en degré (valeur aberrante pour des radians et les grades sont très peu utilisés). Donc là tu bataille pour 1e-6 degrés. Ce qui est ridiculement petit, c'est environ 1.7e-8 radians. Pour rappel, 1e-3 radian correspond à un arc de cercle de 1 m pour un rayon de 1000 m. => 1,7e-8 radians correspond à peu prés à 17 microns. Evidement, si tu veux faire des calculs astronomiques, ça ne suffit pas, mais pour ce type de calculs, il y a des bibliothèques mathématiques dédiées. Dans la vie de tous les jours ça suffit plus que largement.