Ajouter un commentaire

willbback
Bon, je vais encore me mêler de la chose...

Comme je ne sais pas faire des maths, et comme je ne fais qu'une chose de bien, c'est de tracer l'exécution du programme, je vous propose de modifier légèrement la boucle du calcul de sumSQR avec la code que voici :

            double sumSQRant = 0;
            for (int j = 0; j < i - 1; j++) {
                sumSQR += carre(coordonnees[i][j]);
                if (Double.isNaN(sumSQR)) {
                	System.out.println("NaN dans le carré sumSQRant, coordonnees[i][j], carre(coordonnees[i][j]):"+sumSQRant+"|"+coordonnees[i][j]+"|"+(carre(coordonnees[i][j])));
                }
                sumSQRant = sumSQR;
            }

Bref, je cherche simplement ou se déclenche le NaN. (je vais finir par aller manger Indien à force de parler de NaN .... j'ai pas pu m'empêcher de la faire celle-là).
J'ai déclenché plusieurs éxécutions aléatoires, car j'ai la flemme d'écrire la fonction de lecture du fichier, mais bon, je ferais peut-être ça plus tard...
Et voilà ce que j'obtiens comme résultat :
NaN dans le carré i, j, sumSQRant, coordonnees[i][j], carre(coordonnees[i][j]):37|35|15.706202875865124|NaN|NaN
NaN dans le carré i, j, sumSQRant, coordonnees[i][j], carre(coordonnees[i][j]):38|35|11.689362043699964|NaN|NaN
NaN dans le carré i, j, sumSQRant, coordonnees[i][j], carre(coordonnees[i][j]):38|36|NaN|NaN|NaN
NaN dans le carré i, j, sumSQRant, coordonnees[i][j], carre(coordonnees[i][j]):39|35|10.739514060053297|NaN|NaN
NaN dans le carré i, j, sumSQRant, coordonnees[i][j], carre(coordonnees[i][j]):39|36|NaN|NaN|NaN
NaN dans le carré i, j, sumSQRant, coordonnees[i][j], carre(coordonnees[i][j]):39|37|NaN|NaN|NaN

Le Nan se propage car il s'appuit sur un Nan précédement calculé. Le Nan précédement calculé provient de la racine carré d'un nombre négatif.
J'ai fait afficher norme et sumSQR côte à côte et l'on voit bien le phénomène se produire (sumSQR>norme)
Même en utilisant des BigDécimaux, le problème se pose également.
Donc si tout est juste (formule math, algo etc...), soit java ne peut pas t'apporte la précision que nécessite tes calculs, donc change de language pour faire ton problème, soit, puisque le problème temps a disparaître avec des nombres plus grands, transpose tes unités de mesure si c'est possible (*100 ou *1000) et ton problème sera résolue. En tout cas, je lirai la suite de cette aventure avec plaisir, mais là moi, je jette l'éponge

Filtered HTML

Plain text

CAPTCHA
Cette question permet de vérifier que vous n'êtes pas un robot spammeur :-)
 H  H   QQQ     GGG   ZZZZZ  K  K 
H H Q Q G Z K K
HHHH Q Q G GG Z KK
H H Q QQ G G Z K K
H H QQQQ GGG ZZZZZ K K
Q