Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
Je dois travailler avec des flottants pour tracer l'axe d'un repère.
J'ai une routine qui renvoie un pixel en fonction de coordonnées
flottantes (des double).
Maintenant, je dois dessiner un tiret de, disons -1.0 jusqu'à 1.0 tous
les 0.1, donc -1.0, -0.9, ..., 0.0, ..., 1.0
Apparemment, partir de -1.0 et ajouter 0.1 à chaque pas, ça ne
fonctionne visiblement pas. Pour le tiret du milieu, quand je compare ma
valeur à 0.0, ça me renvoie faux :/ Alors que pourtant, je n'ai fait
qu'incrémenter ma valeur de 0.1.
Je pense que c'est un problème récurrent mais j'ai vraiment du mal à
comprendre.
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
Je dois travailler avec des flottants pour tracer l'axe d'un repère.
J'ai une routine qui renvoie un pixel en fonction de coordonnées
flottantes (des double).
Maintenant, je dois dessiner un tiret de, disons -1.0 jusqu'à 1.0 tous
les 0.1, donc -1.0, -0.9, ..., 0.0, ..., 1.0
Apparemment, partir de -1.0 et ajouter 0.1 à chaque pas, ça ne
fonctionne visiblement pas. Pour le tiret du milieu, quand je compare ma
valeur à 0.0, ça me renvoie faux :/ Alors que pourtant, je n'ai fait
qu'incrémenter ma valeur de 0.1.
Je pense que c'est un problème récurrent mais j'ai vraiment du mal à
comprendre.
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
Je dois travailler avec des flottants pour tracer l'axe d'un repère.
J'ai une routine qui renvoie un pixel en fonction de coordonnées
flottantes (des double).
Maintenant, je dois dessiner un tiret de, disons -1.0 jusqu'à 1.0 tous
les 0.1, donc -1.0, -0.9, ..., 0.0, ..., 1.0
Apparemment, partir de -1.0 et ajouter 0.1 à chaque pas, ça ne
fonctionne visiblement pas. Pour le tiret du milieu, quand je compare ma
valeur à 0.0, ça me renvoie faux :/ Alors que pourtant, je n'ai fait
qu'incrémenter ma valeur de 0.1.
Je pense que c'est un problème récurrent mais j'ai vraiment du mal à
comprendre.
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
Je dois travailler avec des flottants pour tracer l'axe d'un repère.
J'ai une routine qui renvoie un pixel en fonction de coordonnées
flottantes (des double).
Maintenant, je dois dessiner un tiret de, disons -1.0 jusqu'à 1.0 tous
les 0.1, donc -1.0, -0.9, ..., 0.0, ..., 1.0
Apparemment, partir de -1.0 et ajouter 0.1 à chaque pas, ça ne
fonctionne visiblement pas. Pour le tiret du milieu, quand je compare ma
valeur à 0.0, ça me renvoie faux :/ Alors que pourtant, je n'ai fait
qu'incrémenter ma valeur de 0.1.
Je pense que c'est un problème récurrent mais j'ai vraiment du mal à
comprendre.
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
Je dois travailler avec des flottants pour tracer l'axe d'un repère.
J'ai une routine qui renvoie un pixel en fonction de coordonnées
flottantes (des double).
Maintenant, je dois dessiner un tiret de, disons -1.0 jusqu'à 1.0 tous
les 0.1, donc -1.0, -0.9, ..., 0.0, ..., 1.0
Apparemment, partir de -1.0 et ajouter 0.1 à chaque pas, ça ne
fonctionne visiblement pas. Pour le tiret du milieu, quand je compare ma
valeur à 0.0, ça me renvoie faux :/ Alors que pourtant, je n'ai fait
qu'incrémenter ma valeur de 0.1.
Je pense que c'est un problème récurrent mais j'ai vraiment du mal à
comprendre.
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
Je dois travailler avec des flottants pour tracer l'axe d'un repère.
J'ai une routine qui renvoie un pixel en fonction de coordonnées
flottantes (des double).
Maintenant, je dois dessiner un tiret de, disons -1.0 jusqu'à 1.0 tous
les 0.1, donc -1.0, -0.9, ..., 0.0, ..., 1.0
Apparemment, partir de -1.0 et ajouter 0.1 à chaque pas, ça ne
fonctionne visiblement pas. Pour le tiret du milieu, quand je compare ma
valeur à 0.0, ça me renvoie faux :/ Alors que pourtant, je n'ai fait
qu'incrémenter ma valeur de 0.1.
Je pense que c'est un problème récurrent mais j'ai vraiment du mal à
comprendre.
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
Apparemment, partir de -1.0 et ajouter 0.1 à chaque pas, ça ne
fonctionne visiblement pas. Pour le tiret du milieu, quand je compare ma
valeur à 0.0, ça me renvoie faux :/ Alors que pourtant, je n'ai fait
qu'incrémenter ma valeur de 0.1.
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
Apparemment, partir de -1.0 et ajouter 0.1 à chaque pas, ça ne
fonctionne visiblement pas. Pour le tiret du milieu, quand je compare ma
valeur à 0.0, ça me renvoie faux :/ Alors que pourtant, je n'ai fait
qu'incrémenter ma valeur de 0.1.
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
Apparemment, partir de -1.0 et ajouter 0.1 à chaque pas, ça ne
fonctionne visiblement pas. Pour le tiret du milieu, quand je compare ma
valeur à 0.0, ça me renvoie faux :/ Alors que pourtant, je n'ai fait
qu'incrémenter ma valeur de 0.1.
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
Avec des flottant, on ne peut pas...
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
Avec des flottant, on ne peut pas...
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
Avec des flottant, on ne peut pas...
none none wrote on 19/03/2006 18:46:Je dois travailler avec des flottants pour tracer l'axe d'un
repère. J'ai une routine qui renvoie un pixel en fonction de
coordonnées flottantes (des double).
Maintenant, je dois dessiner un tiret de, disons -1.0
jusqu'à 1.0 tous les 0.1, donc -1.0, -0.9, ..., 0.0, ...,
1.0
Apparemment, partir de -1.0 et ajouter 0.1 à chaque pas, ça
ne fonctionne visiblement pas. Pour le tiret du milieu,
quand je compare ma valeur à 0.0, ça me renvoie faux :/
Alors que pourtant, je n'ai fait qu'incrémenter ma valeur de
0.1.
Je pense que c'est un problème récurrent mais j'ai vraiment
du mal à comprendre.
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
un flottant est nécessairement une valeur définie + ou - sa
précision,
et cette précision dépend de la taille alloué au type;
historiquement le type float a la taille des registres du
CPU/CoPro, le type double le double; sur ces n bits de
stockage sont codés le signe, l'exposant et la mantisse (la
valeur décimale compris entre 0 et 0.99999999..).
chaque opération flottante génère une incertitude relative sur
le résultat (tel qu'on nous l'apprenait en TP de chimie par
exemple);
donc tous tests stricts est voué à l'échec et doit plutôt être
codé en comparant l'écart entre la valeur courante et la
valeur supposé d'une part et la précision du type utilisé
d'autre part.
concrétement:
ne pas coder if (f == 1.0) {}
mais if (fabs(f - 1.0) < 1e-8) {}
ce type de codage est indispensable lors que vous n'avez pas
d'autre choix que d'utiliser des flottants (et que des
flottants); partout ou cela n'est pas indispensable on
réalisera les opérations en entiers et on convertit (ou
seulement exprime) en flottants au dernier moment.
dans votre cas, vous devriez coder:
for (tick = -10; tick <= 10; ++tick){
// calcul des coord. en entiers (les pixels sont des entiers)
// évaluation d'un libellé comme "tick / 10.0"
}
none none wrote on 19/03/2006 18:46:
Je dois travailler avec des flottants pour tracer l'axe d'un
repère. J'ai une routine qui renvoie un pixel en fonction de
coordonnées flottantes (des double).
Maintenant, je dois dessiner un tiret de, disons -1.0
jusqu'à 1.0 tous les 0.1, donc -1.0, -0.9, ..., 0.0, ...,
1.0
Apparemment, partir de -1.0 et ajouter 0.1 à chaque pas, ça
ne fonctionne visiblement pas. Pour le tiret du milieu,
quand je compare ma valeur à 0.0, ça me renvoie faux :/
Alors que pourtant, je n'ai fait qu'incrémenter ma valeur de
0.1.
Je pense que c'est un problème récurrent mais j'ai vraiment
du mal à comprendre.
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
un flottant est nécessairement une valeur définie + ou - sa
précision,
et cette précision dépend de la taille alloué au type;
historiquement le type float a la taille des registres du
CPU/CoPro, le type double le double; sur ces n bits de
stockage sont codés le signe, l'exposant et la mantisse (la
valeur décimale compris entre 0 et 0.99999999..).
chaque opération flottante génère une incertitude relative sur
le résultat (tel qu'on nous l'apprenait en TP de chimie par
exemple);
donc tous tests stricts est voué à l'échec et doit plutôt être
codé en comparant l'écart entre la valeur courante et la
valeur supposé d'une part et la précision du type utilisé
d'autre part.
concrétement:
ne pas coder if (f == 1.0) {}
mais if (fabs(f - 1.0) < 1e-8) {}
ce type de codage est indispensable lors que vous n'avez pas
d'autre choix que d'utiliser des flottants (et que des
flottants); partout ou cela n'est pas indispensable on
réalisera les opérations en entiers et on convertit (ou
seulement exprime) en flottants au dernier moment.
dans votre cas, vous devriez coder:
for (tick = -10; tick <= 10; ++tick){
// calcul des coord. en entiers (les pixels sont des entiers)
// évaluation d'un libellé comme "tick / 10.0"
}
none none wrote on 19/03/2006 18:46:Je dois travailler avec des flottants pour tracer l'axe d'un
repère. J'ai une routine qui renvoie un pixel en fonction de
coordonnées flottantes (des double).
Maintenant, je dois dessiner un tiret de, disons -1.0
jusqu'à 1.0 tous les 0.1, donc -1.0, -0.9, ..., 0.0, ...,
1.0
Apparemment, partir de -1.0 et ajouter 0.1 à chaque pas, ça
ne fonctionne visiblement pas. Pour le tiret du milieu,
quand je compare ma valeur à 0.0, ça me renvoie faux :/
Alors que pourtant, je n'ai fait qu'incrémenter ma valeur de
0.1.
Je pense que c'est un problème récurrent mais j'ai vraiment
du mal à comprendre.
Comment faire proprement pour avoir -1.0, -0.9, etc .. ?
un flottant est nécessairement une valeur définie + ou - sa
précision,
et cette précision dépend de la taille alloué au type;
historiquement le type float a la taille des registres du
CPU/CoPro, le type double le double; sur ces n bits de
stockage sont codés le signe, l'exposant et la mantisse (la
valeur décimale compris entre 0 et 0.99999999..).
chaque opération flottante génère une incertitude relative sur
le résultat (tel qu'on nous l'apprenait en TP de chimie par
exemple);
donc tous tests stricts est voué à l'échec et doit plutôt être
codé en comparant l'écart entre la valeur courante et la
valeur supposé d'une part et la précision du type utilisé
d'autre part.
concrétement:
ne pas coder if (f == 1.0) {}
mais if (fabs(f - 1.0) < 1e-8) {}
ce type de codage est indispensable lors que vous n'avez pas
d'autre choix que d'utiliser des flottants (et que des
flottants); partout ou cela n'est pas indispensable on
réalisera les opérations en entiers et on convertit (ou
seulement exprime) en flottants au dernier moment.
dans votre cas, vous devriez coder:
for (tick = -10; tick <= 10; ++tick){
// calcul des coord. en entiers (les pixels sont des entiers)
// évaluation d'un libellé comme "tick / 10.0"
}
un flottant est nécessairement une valeur définie + ou - sa
précision,
Strictement parlant... Un flottant a une valeur précise ; il n'y
a pas de + ou -. Pour des raisons évidentes (représentation
finie), les flottants ne peuvent pas représenter tous les réels
(ni toutes les rationnelles)
0.1 est une des valeurs qu'ils ne peuvent pas représenter.
qui fait qu'il n'ajoute pas 0.1 à chaque passage dans la boucle,
mais quelque chose de proche.
Ça dépend des formats, mais en IEEE (le format le plus répandu
aujourd'hui), la valeur décimale de la mantisse s'étend de 0.5 à
1.0-epsilon (ou epsilon est 2^-53, je crois).
Il y a aussi des valeurs spéciales, identifiées par une valeur
spéciale dans l'exposant -- 0.0 est sans doute celle qu'on
rencontre la plus souvent.
Là aussi, ça dépend du point de vue. La valeur du résultat est
bien définie.
Seulement, dans certains cas, elle sera différente
de celle du résultat de l'opération sur les réels. Mais
attention : dans son cas, ça ne serait pas souvent le cas.
Et statistiquement, souvent, ces différences s'anullera.
Son véritable problème, c'est que la valeur qu'il ajoute n'est
pas ce qu'il veut.
Ça dépend de l'application ; souvent, les valeurs en entrée sont
déjà des approximations, et c'est tout à fait normal de prendre
en compte des epsilons quand on cherche une valeur précises --
en fait, ce qu'on veut, au niveau de l'application, c'est déjà
x+/-epsilon (avec un epsilon qui dépend de l'application).
Mais ce n'est pas une règle générale ; ça dépend de
l'application. Et il faut bien ne pas oublier que si on définit
un isEqual() approximatif, alors isEqual(a,b) && isEqual(b,c)
n'implique plut isEqual(a,c) -- ce qui peut faire échouer
certaines algorithmes.
Il y a pire, évidemment, et certains algorithmes, pour certaines
valeurs (qui n'apparaîtront pas dans vos tests, évidemment)
peuvent ne pas converger avec les opérations sur des flottants,
alors qu'ils convergeront bien avec les mêmes opérations sur des
réels.
concrétement:
ne pas coder if (f == 1.0) {}
mais if (fabs(f - 1.0) < 1e-8) {}
Si tu sais que dans ton application, la précision des valeurs
est de l'ordre 1e-8.
Dans les rares cas où je me sers des flottants,
je m'arrange pour que les valeurs soient toujours
exactes.
En revanche, dans une application où je traiterais des
valeurs lues des instruments de mésure électronique, la
précision serait plutôt de l'ordre 1e-2 ou 1e-3 -- les
instruments ne peuvent pas me donner de plus, de toute façon.
C'est le genre de règle naïve qui donne l'air de marcher,
parfois, mais donne aussi des résultats trompeurs dans d'autres
cas.
Ça, en revanche, c'est un conseil excellent. [...]
C'est certainement la solution dans son cas. Au moins qu'il
n'affiche 17 décimaux ou plus, il verra les valeurs auxquelles
il s'attend.
un flottant est nécessairement une valeur définie + ou - sa
précision,
Strictement parlant... Un flottant a une valeur précise ; il n'y
a pas de + ou -. Pour des raisons évidentes (représentation
finie), les flottants ne peuvent pas représenter tous les réels
(ni toutes les rationnelles)
0.1 est une des valeurs qu'ils ne peuvent pas représenter.
qui fait qu'il n'ajoute pas 0.1 à chaque passage dans la boucle,
mais quelque chose de proche.
Ça dépend des formats, mais en IEEE (le format le plus répandu
aujourd'hui), la valeur décimale de la mantisse s'étend de 0.5 à
1.0-epsilon (ou epsilon est 2^-53, je crois).
Il y a aussi des valeurs spéciales, identifiées par une valeur
spéciale dans l'exposant -- 0.0 est sans doute celle qu'on
rencontre la plus souvent.
Là aussi, ça dépend du point de vue. La valeur du résultat est
bien définie.
Seulement, dans certains cas, elle sera différente
de celle du résultat de l'opération sur les réels. Mais
attention : dans son cas, ça ne serait pas souvent le cas.
Et statistiquement, souvent, ces différences s'anullera.
Son véritable problème, c'est que la valeur qu'il ajoute n'est
pas ce qu'il veut.
Ça dépend de l'application ; souvent, les valeurs en entrée sont
déjà des approximations, et c'est tout à fait normal de prendre
en compte des epsilons quand on cherche une valeur précises --
en fait, ce qu'on veut, au niveau de l'application, c'est déjà
x+/-epsilon (avec un epsilon qui dépend de l'application).
Mais ce n'est pas une règle générale ; ça dépend de
l'application. Et il faut bien ne pas oublier que si on définit
un isEqual() approximatif, alors isEqual(a,b) && isEqual(b,c)
n'implique plut isEqual(a,c) -- ce qui peut faire échouer
certaines algorithmes.
Il y a pire, évidemment, et certains algorithmes, pour certaines
valeurs (qui n'apparaîtront pas dans vos tests, évidemment)
peuvent ne pas converger avec les opérations sur des flottants,
alors qu'ils convergeront bien avec les mêmes opérations sur des
réels.
concrétement:
ne pas coder if (f == 1.0) {}
mais if (fabs(f - 1.0) < 1e-8) {}
Si tu sais que dans ton application, la précision des valeurs
est de l'ordre 1e-8.
Dans les rares cas où je me sers des flottants,
je m'arrange pour que les valeurs soient toujours
exactes.
En revanche, dans une application où je traiterais des
valeurs lues des instruments de mésure électronique, la
précision serait plutôt de l'ordre 1e-2 ou 1e-3 -- les
instruments ne peuvent pas me donner de plus, de toute façon.
C'est le genre de règle naïve qui donne l'air de marcher,
parfois, mais donne aussi des résultats trompeurs dans d'autres
cas.
Ça, en revanche, c'est un conseil excellent. [...]
C'est certainement la solution dans son cas. Au moins qu'il
n'affiche 17 décimaux ou plus, il verra les valeurs auxquelles
il s'attend.
un flottant est nécessairement une valeur définie + ou - sa
précision,
Strictement parlant... Un flottant a une valeur précise ; il n'y
a pas de + ou -. Pour des raisons évidentes (représentation
finie), les flottants ne peuvent pas représenter tous les réels
(ni toutes les rationnelles)
0.1 est une des valeurs qu'ils ne peuvent pas représenter.
qui fait qu'il n'ajoute pas 0.1 à chaque passage dans la boucle,
mais quelque chose de proche.
Ça dépend des formats, mais en IEEE (le format le plus répandu
aujourd'hui), la valeur décimale de la mantisse s'étend de 0.5 à
1.0-epsilon (ou epsilon est 2^-53, je crois).
Il y a aussi des valeurs spéciales, identifiées par une valeur
spéciale dans l'exposant -- 0.0 est sans doute celle qu'on
rencontre la plus souvent.
Là aussi, ça dépend du point de vue. La valeur du résultat est
bien définie.
Seulement, dans certains cas, elle sera différente
de celle du résultat de l'opération sur les réels. Mais
attention : dans son cas, ça ne serait pas souvent le cas.
Et statistiquement, souvent, ces différences s'anullera.
Son véritable problème, c'est que la valeur qu'il ajoute n'est
pas ce qu'il veut.
Ça dépend de l'application ; souvent, les valeurs en entrée sont
déjà des approximations, et c'est tout à fait normal de prendre
en compte des epsilons quand on cherche une valeur précises --
en fait, ce qu'on veut, au niveau de l'application, c'est déjà
x+/-epsilon (avec un epsilon qui dépend de l'application).
Mais ce n'est pas une règle générale ; ça dépend de
l'application. Et il faut bien ne pas oublier que si on définit
un isEqual() approximatif, alors isEqual(a,b) && isEqual(b,c)
n'implique plut isEqual(a,c) -- ce qui peut faire échouer
certaines algorithmes.
Il y a pire, évidemment, et certains algorithmes, pour certaines
valeurs (qui n'apparaîtront pas dans vos tests, évidemment)
peuvent ne pas converger avec les opérations sur des flottants,
alors qu'ils convergeront bien avec les mêmes opérations sur des
réels.
concrétement:
ne pas coder if (f == 1.0) {}
mais if (fabs(f - 1.0) < 1e-8) {}
Si tu sais que dans ton application, la précision des valeurs
est de l'ordre 1e-8.
Dans les rares cas où je me sers des flottants,
je m'arrange pour que les valeurs soient toujours
exactes.
En revanche, dans une application où je traiterais des
valeurs lues des instruments de mésure électronique, la
précision serait plutôt de l'ordre 1e-2 ou 1e-3 -- les
instruments ne peuvent pas me donner de plus, de toute façon.
C'est le genre de règle naïve qui donne l'air de marcher,
parfois, mais donne aussi des résultats trompeurs dans d'autres
cas.
Ça, en revanche, c'est un conseil excellent. [...]
C'est certainement la solution dans son cas. Au moins qu'il
n'affiche 17 décimaux ou plus, il verra les valeurs auxquelles
il s'attend.
(ni toutes les rationnelles) ; malheureusement pour none none,
0.1 est une des valeurs qu'ils ne peuvent pas représenter. Ce
qui fait qu'il n'ajoute pas 0.1 à chaque passage dans la boucle,
mais quelque chose de proche.
(ni toutes les rationnelles) ; malheureusement pour none none,
0.1 est une des valeurs qu'ils ne peuvent pas représenter. Ce
qui fait qu'il n'ajoute pas 0.1 à chaque passage dans la boucle,
mais quelque chose de proche.
(ni toutes les rationnelles) ; malheureusement pour none none,
0.1 est une des valeurs qu'ils ne peuvent pas représenter. Ce
qui fait qu'il n'ajoute pas 0.1 à chaque passage dans la boucle,
mais quelque chose de proche.
2- puisque apparemment ce que tu aimes développer le plus est l'art de
la contradiction (ni systématiquement intéressante, ni spécialement en
charte), je me sens obligé d'indiquer que ce "bizutage" me laisse de glace.
0.1 est une des valeurs qu'ils ne peuvent pas représenter.
et t'as décréter ça tout seul sans même connaître la précision de son
type double !! ben tu vois un Cray tout bête se représente parfaitement 0.1
tout ceci étant hors chartre, google IEEE.
Il y a aussi des valeurs spéciales, identifiées par une valeur
spéciale dans l'exposant -- 0.0 est sans doute celle qu'on rencontre
la plus souvent.
de l'exposant *et* de la mantisse.
soit il y a le nombre zero (E = 0; F = 0; S = 1)
tu as juste oublié:
-0 (E = 0; F = 0; S = 1)
-Infinity
Infinity
NaN
Là aussi, ça dépend du point de vue. La valeur du résultat est
bien définie.
on va dire ça; tabl[4325] est "indéfini" mais savoir comment le dernier
bit d'un flottant est arrondi par tous les unités flottantes de tous les
fondeurs est "définie" .. "selon le point de vue de James".
Mais ce n'est pas une règle générale ; ça dépend de
l'application. Et il faut bien ne pas oublier que si on définit
un isEqual() approximatif, alors isEqual(a,b) && isEqual(b,c)
n'implique plut isEqual(a,c) -- ce qui peut faire échouer
certaines algorithmes.
oui, seulement si tu ne sais pas coder ton isEqual.
Il y a pire, évidemment, et certains algorithmes, pour certaines
valeurs (qui n'apparaîtront pas dans vos tests, évidemment)
peuvent ne pas converger avec les opérations sur des flottants,
alors qu'ils convergeront bien avec les mêmes opérations sur des
réels.
si "réel" voulait signifier "précision arbitraire" (via une librarie
es-spéciale et non une simple unité de calcul flottant) c'est faux
également.
concrétement:
ne pas coder if (f == 1.0) {}
mais if (fabs(f - 1.0) < 1e-8) {}
Si tu sais que dans ton application, la précision des valeurs
est de l'ordre 1e-8.
?!?? non, si tu sais que tu utilises des float (32bits), on utilisera
1e-12 avec des doubles et 1e-14 avec des long doubles.
Dans les rares cas où je me sers des flottants, je m'arrange pour que
les valeurs soient toujours
exactes.
c'est pas du n'importe quoi là ??, tu as répété après tout le monde que
tous les nombres flottants ne pouvaient pas avoir une représentation
exacte de leur valeur, mais toi, abracadabra, tu t'"arranges" avec eux
et hop "c'est exact"; tiens codes donc exactement 7/5
2- puisque apparemment ce que tu aimes développer le plus est l'art de
la contradiction (ni systématiquement intéressante, ni spécialement en
charte), je me sens obligé d'indiquer que ce "bizutage" me laisse de glace.
0.1 est une des valeurs qu'ils ne peuvent pas représenter.
et t'as décréter ça tout seul sans même connaître la précision de son
type double !! ben tu vois un Cray tout bête se représente parfaitement 0.1
tout ceci étant hors chartre, google IEEE.
Il y a aussi des valeurs spéciales, identifiées par une valeur
spéciale dans l'exposant -- 0.0 est sans doute celle qu'on rencontre
la plus souvent.
de l'exposant *et* de la mantisse.
soit il y a le nombre zero (E = 0; F = 0; S = 1)
tu as juste oublié:
-0 (E = 0; F = 0; S = 1)
-Infinity
Infinity
NaN
Là aussi, ça dépend du point de vue. La valeur du résultat est
bien définie.
on va dire ça; tabl[4325] est "indéfini" mais savoir comment le dernier
bit d'un flottant est arrondi par tous les unités flottantes de tous les
fondeurs est "définie" .. "selon le point de vue de James".
Mais ce n'est pas une règle générale ; ça dépend de
l'application. Et il faut bien ne pas oublier que si on définit
un isEqual() approximatif, alors isEqual(a,b) && isEqual(b,c)
n'implique plut isEqual(a,c) -- ce qui peut faire échouer
certaines algorithmes.
oui, seulement si tu ne sais pas coder ton isEqual.
Il y a pire, évidemment, et certains algorithmes, pour certaines
valeurs (qui n'apparaîtront pas dans vos tests, évidemment)
peuvent ne pas converger avec les opérations sur des flottants,
alors qu'ils convergeront bien avec les mêmes opérations sur des
réels.
si "réel" voulait signifier "précision arbitraire" (via une librarie
es-spéciale et non une simple unité de calcul flottant) c'est faux
également.
concrétement:
ne pas coder if (f == 1.0) {}
mais if (fabs(f - 1.0) < 1e-8) {}
Si tu sais que dans ton application, la précision des valeurs
est de l'ordre 1e-8.
?!?? non, si tu sais que tu utilises des float (32bits), on utilisera
1e-12 avec des doubles et 1e-14 avec des long doubles.
Dans les rares cas où je me sers des flottants, je m'arrange pour que
les valeurs soient toujours
exactes.
c'est pas du n'importe quoi là ??, tu as répété après tout le monde que
tous les nombres flottants ne pouvaient pas avoir une représentation
exacte de leur valeur, mais toi, abracadabra, tu t'"arranges" avec eux
et hop "c'est exact"; tiens codes donc exactement 7/5
2- puisque apparemment ce que tu aimes développer le plus est l'art de
la contradiction (ni systématiquement intéressante, ni spécialement en
charte), je me sens obligé d'indiquer que ce "bizutage" me laisse de glace.
0.1 est une des valeurs qu'ils ne peuvent pas représenter.
et t'as décréter ça tout seul sans même connaître la précision de son
type double !! ben tu vois un Cray tout bête se représente parfaitement 0.1
tout ceci étant hors chartre, google IEEE.
Il y a aussi des valeurs spéciales, identifiées par une valeur
spéciale dans l'exposant -- 0.0 est sans doute celle qu'on rencontre
la plus souvent.
de l'exposant *et* de la mantisse.
soit il y a le nombre zero (E = 0; F = 0; S = 1)
tu as juste oublié:
-0 (E = 0; F = 0; S = 1)
-Infinity
Infinity
NaN
Là aussi, ça dépend du point de vue. La valeur du résultat est
bien définie.
on va dire ça; tabl[4325] est "indéfini" mais savoir comment le dernier
bit d'un flottant est arrondi par tous les unités flottantes de tous les
fondeurs est "définie" .. "selon le point de vue de James".
Mais ce n'est pas une règle générale ; ça dépend de
l'application. Et il faut bien ne pas oublier que si on définit
un isEqual() approximatif, alors isEqual(a,b) && isEqual(b,c)
n'implique plut isEqual(a,c) -- ce qui peut faire échouer
certaines algorithmes.
oui, seulement si tu ne sais pas coder ton isEqual.
Il y a pire, évidemment, et certains algorithmes, pour certaines
valeurs (qui n'apparaîtront pas dans vos tests, évidemment)
peuvent ne pas converger avec les opérations sur des flottants,
alors qu'ils convergeront bien avec les mêmes opérations sur des
réels.
si "réel" voulait signifier "précision arbitraire" (via une librarie
es-spéciale et non une simple unité de calcul flottant) c'est faux
également.
concrétement:
ne pas coder if (f == 1.0) {}
mais if (fabs(f - 1.0) < 1e-8) {}
Si tu sais que dans ton application, la précision des valeurs
est de l'ordre 1e-8.
?!?? non, si tu sais que tu utilises des float (32bits), on utilisera
1e-12 avec des doubles et 1e-14 avec des long doubles.
Dans les rares cas où je me sers des flottants, je m'arrange pour que
les valeurs soient toujours
exactes.
c'est pas du n'importe quoi là ??, tu as répété après tout le monde que
tous les nombres flottants ne pouvaient pas avoir une représentation
exacte de leur valeur, mais toi, abracadabra, tu t'"arranges" avec eux
et hop "c'est exact"; tiens codes donc exactement 7/5
2- puisque apparemment ce que tu aimes développer le plus est l'art de
la contradiction (ni systématiquement intéressante, ni spécialement en
charte), je me sens obligé d'indiquer que ce "bizutage" me laisse de glace.
2- puisque apparemment ce que tu aimes développer le plus est l'art de
la contradiction (ni systématiquement intéressante, ni spécialement en
charte), je me sens obligé d'indiquer que ce "bizutage" me laisse de glace.
2- puisque apparemment ce que tu aimes développer le plus est l'art de
la contradiction (ni systématiquement intéressante, ni spécialement en
charte), je me sens obligé d'indiquer que ce "bizutage" me laisse de glace.