|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre Expert
![]() Inscription : avril 2004 Messages : 1 132 ![]() |
Vous êtes tous d'accord que la valeur entière arrondie à l'inférieur de 1 c'est 1, n'est-ce pas ?
Essayez ceci : SELECT FLOOR(1/3+2/3) J'ai rapporté le bug sur la page de bugs de MySQL, et le rapport était introuvable le lendemain. Pas très sérieux. |
|
|
00
|
|
|
#2 | |
|
Membre Expert
![]() Inscription : mai 2002 Messages : 1 022 ![]() |
Citation:
Normal , SELECT FLOOR(1/3+2/3) doit bien retourner 1 Je te renvoie à tes cours de mathématiques sur la distributivité. La base de ces axiomes (ou théorème, je ne sais plus) déclarent qu'on commence par calculer ce qui est entre parenthèse. En effet, FLOOR(1/3+2/3)=SELECT FLOOR(1) = 1 Tu confonds avec : SELECT FLOOR(1/3)+FLOOR(2/3) = SELECT 0 + 0 = 0 Avant de critiquer le sérieux de développeurs qui analysent les bugs soumis, il faut être sûr de ce qu'on écrit. Allez l'erreur est humaine sans rancune aucune PS : j'ai vérifié c'est un théorème et non un axiome.
__________________
Alexandre T. PHP5/MySQL5 Codes prêts à l'emploi 30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc... Mes articles |
|
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Inscription : avril 2004 Messages : 1 132 ![]() |
|
|
|
00
|
|
|
#4 |
|
Provisoirement toléré
Inscription : juin 2003 Messages : 2 622 ![]() |
Ca vient sûrement de la représentation interne des flottants qui n'est pas exacte (0.99999 au lieu de 1). En revanche ceci fonctionne :
Code :
SELECT FLOOR(cast(1/3+2/3 AS decimal))
__________________
Pensez au bouton
|
|
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() Inscription : avril 2004 Messages : 1 132 ![]() |
Oui, ça vient de ça. Mais c'est en fait un peu plus pénible que ça encore.
Le problème n'existe pas QUE dans ce cas précis. Il existe également dans ce cas là : Code :
On est forcé de caster lors de l'insertion en fait, comme le dit Maximilian. Ce qui peut être bien embêtant pour certaines version de mysql4. |
||
|
|
00
|
|
|
#6 | |
|
Provisoirement toléré
Inscription : juin 2003 Messages : 2 622 ![]() |
Citation:
Edit : ce comportement disparait peut-être avec la 5.0, à tester...
__________________
Pensez au bouton
|
|
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Inscription : mai 2002 Messages : 1 022 ![]() |
Ok je sors... J'ai compris que ça retournais un et que tu voulais zéro ...
Bon bah le zéro là dessus c'est moi !
__________________
Alexandre T. PHP5/MySQL5 Codes prêts à l'emploi 30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc... Mes articles |
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Inscription : mai 2002 Messages : 1 022 ![]() |
Même résultat en 5.0.18-nt
__________________
Alexandre T. PHP5/MySQL5 Codes prêts à l'emploi 30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc... Mes articles |
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Inscription : mai 2002 Messages : 1 022 ![]() |
Par contre, je comprends "une" erreur dans un sens.
Les valeurs ont mal été arrondies à leur insertion dans mysql. Normalement un SELECT * from test devrait retourné : id - Valeur 1 - 0.333333 2 - 0.666667 Mais cela retourne id - Valeur 1 - 0.333333 2 - 0.666666 Par conséquent la somme des deux retourne 0.999999 et non 1. L'erreur n'est pas dans la fonction FLOOR. On peut penser que si il y a une erreur, elle est dans la façon dont mysql arrondie le dernier chiffre après la virgule.
__________________
Alexandre T. PHP5/MySQL5 Codes prêts à l'emploi 30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc... Mes articles |
|
|
00
|
|
|
#10 | ||
|
Membre Expert
![]() Inscription : mai 2002 Messages : 1 022 ![]() |
J'ai refait le test depuis la console pour éviter toute "verrolation" du processus par une éventuelle erreur de phpmyadmin.
Le résultat est similaire : Code :
__________________
Alexandre T. PHP5/MySQL5 Codes prêts à l'emploi 30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc... Mes articles |
||
|
|
00
|
|
|
#11 | |
|
Membre Expert
![]() Inscription : avril 2004 Messages : 1 132 ![]() |
Citation:
A noter qu'il ne s'agit pas d'un bug de taille de donnée, dans la mesure où : INSERT INTO test (id,value) VALUES (1, 2/3 ), (2, 0.666666666666666666666666666666666666666666) donnera un résultat incorrect à l'id 1 et un bon resultat à l'id 2. A savoir : 1 => 0.666666666 2 => 0.666666666666667 Il s'agit donc bien de la façon dont mysql interprête certaines données. Je veux dire :mysql est capable de sauvegarder des données de type DOUBLE avec 15 chiffres après la virgule, mais il ne fera aucun arrondi, tant qu'il n'aura pas au moins 16 chiffres après la virgule. Si on insère : (3, 0.666666666666666) (15 chiffres après la virgule), il ne fait toujours pas d'arrondi. C'est grave, je trouve, une telle imprécision sur ce genre de calculs. Et c'est encore plus grave de nier l'existence d'un bug, comme ils semblent le faire. Edit : Le bug est toujours là avec la 5.0.21, maximilian. |
|
|
|
00
|
|
|
#12 | ||||||
|
Membre Expert
![]() Inscription : août 2002 Messages : 1 036 ![]() |
Après exécution du code ci-dessous :
Code :
Code :
Code :
|
||||||
|
|
00
|
|
|
#13 |
|
Membre Expert
![]() Inscription : mai 2002 Messages : 1 022 ![]() |
Ce qui m'étonne est un fonction que nous qualifions de correct se réalisait en 4.0.15. Désormais en version 5+, le résultat est différent de ce que nous attendons. Je m'interroge.
Les développeurs ont-ils engendré une regression ou corrigé une erreur. Je vais faire des tests sur d'autres moteurs. Je possède chez moi des cours très complet de mathématiques dont un chapitre bien précis sur la notion d'arrondi. Je vérifierais par acquis de conscience. Néanmoins pour l'instant j'opte pour une regression. Ce qui m'étonnes est que ton bug a disparu. Généralement quand un internaute signale un bug et que cela n'en est point, ils closent le dossier "sans suite" mais ne le supprime pas...
__________________
Alexandre T. PHP5/MySQL5 Codes prêts à l'emploi 30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc... Mes articles |
|
|
00
|
|
|
#14 | |
|
Expert Confirmé Sénior
![]() ![]() Cédric ChatelainDéveloppeur informatique Inscription : janvier 2003 Messages : 4 088 ![]() |
Citation:
__________________
[Règle] Pas de questions techniques par mail ou par MP svp. Sinon je deviens tout rouge ça ne va pas du tout avec la couleur de mes yeux. Que faire quand firefox ne fonctionne plus ? Vous êtes débutant ? Bienvenue à vous. Mes meilleurs conseils sont ceux-ci : 1 : lisez bien ceci http://club.developpez.com/aidenouveaux/ 2 : lisez aussi ceci http://general.developpez.com/cours/ |
|
|
00
|
|
|
#15 |
|
Membre Expert
![]() Inscription : avril 2004 Messages : 1 132 ![]() |
Ah tiens... Marrant, il avait disparu pendant un temps
J'aime bien leur "status : not a bug". Traduction : on sait que ça déconne, mais on a la flemme. C'est pas à nous de produire un vrai truc qui marche convenablement, c'est à l'utilisateur final de se faire chier à implémenter des tests foireux à base d'intervalles merdiques qui leur permetteront d'avoir une maintenance tout à fait atroce. |
|
|
00
|
|
|
#16 |
|
Provisoirement toléré
Inscription : juin 2003 Messages : 2 622 ![]() |
Pour moi le gars avec un nom à coucher dehors a bien expliqué pourquoi ce n'est pas un bug.
Ou est-ce que tu bloques, il suffit de convertir en decimal pour que ça fonctionne ? PS : je viens de tester la requête SELECT FLOOR(1/3+2/3) sur SQL Server 2000 et elle a exactement le même comportement.
__________________
Pensez au bouton
|
|
|
00
|
|
|
#17 |
|
Membre Expert
![]() Inscription : avril 2004 Messages : 1 132 ![]() |
Tu en es sûr ?
Fais ceci : SELECT 1/3+2/3 Puis cela : SELECT FLOOR(1/3+2/3) (les deux sans casts) Moi, la première j'obtiens 1, et pas 0.99999 Donc il est logique que la seconde me renvoie 1 et pas 0. Ou alors c'est que SELECT 1/3+2/3 ne renvoie pas le bon résultat. Je vois pas comment on ne peut pas voir un bug là dedans, c'est ridicule. |
|
|
00
|
|
|
#18 |
|
Expert Confirmé Sénior
![]() ![]() Cédric ChatelainDéveloppeur informatique Inscription : janvier 2003 Messages : 4 088 ![]() |
Moi, en tous cas, je vois une régression... Maintenant, est-ce génant ou blocant ? Je n'ai pas la compétence pour en juger.
__________________
[Règle] Pas de questions techniques par mail ou par MP svp. Sinon je deviens tout rouge ça ne va pas du tout avec la couleur de mes yeux. Que faire quand firefox ne fonctionne plus ? Vous êtes débutant ? Bienvenue à vous. Mes meilleurs conseils sont ceux-ci : 1 : lisez bien ceci http://club.developpez.com/aidenouveaux/ 2 : lisez aussi ceci http://general.developpez.com/cours/ |
|
00
|
|
|
#19 |
|
Provisoirement toléré
Inscription : juin 2003 Messages : 2 622 ![]() |
Encore une fois ce qui est affiché à l'écran peut différer de la représentation interne des flottants.
Cf http://dev.mysql.com/doc/refman/5.0/...ith-float.html
__________________
Pensez au bouton
|
|
|
00
|
|
|
#20 |
|
Membre Expert
![]() Inscription : avril 2004 Messages : 1 132 ![]() |
Je vais prendre un exemple bien concret pour représenter de façon claire ce que je signifie :
Le centre de la terre se situe environ à 149 millions de kilomètres du soleil. La précision de ce nombre s'arrête sur le chiffre des millions. Ma maison se trouve à environ 6000 kilomètres du centre de la terre. Précision sur les milliers. Si je fais le calcul de la distance ma maison/soleil, j'ai 149 millions, 149 006 000 ou 148 994 000 kilomètres ? J'ai toujours 149 millions évidemment. Plus de précision n'a aucun sens, dans la mesure où mes 149 millions de kilomètres séparant la terre du soleil sont une approximation à 1 million près, donc 148 à 150 millions de kilomètres. C'est donc ridicule de dire que ma maison se situe à 149 006 000 ou 148 994 000 kilomètres, dans la mesure où la position de la terre n'est connue qu'à 1 million de kilomètres près (dans cet exemple). 149 (+/- 1) millions de kilomètres + 30 centimètres, ça fait toujours 149 (+/- 1) millions de kilomètres. Avec les flottants, c'est pareil. On aura beau de dire un million de fois que 21.40*1.000000000000000 => 21.3999999999999992 ça restera toujours 21.40, pour les simples raisons que : la précision des nombres est limitée, la précision des calculs sur les flottants est limitée. Alors quand ils nous sortent un exemple de calculs sur des chiffres à 50 chiffres après la virgule, alors que l'opération elle-même n'est significative que sur ~6 ou 7 chiffres après la virgule, pardonnez-moi de ne pas être d'accord, mais pour le coup, je ne pense pas être dans mon tort. Ceci dit, cette histoire est, au pire, une gêne. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com