Erreur d'étatBonjour
J'essaie de faire une vérification delta entre la valeur des cellules voisines sur la même colonne.
For( i = 1, i <= N Row( dtB ), i++,
If(
i == 1,
If( Abs( :Delta[i] - :Delta[i + 1] ) <= 0.1,
dtB:Check[i] = "Pass",
dtB:Check[i] = "Fail"
),
i == N Row( dtB ),
If( Abs( :Delta[i] - :Delta[i - 1] ) <= 0.1,
dtB:Check[i] = "Pass",
dtB:Check[i] = "Fail"
),
If( Abs( :Delta[i] - :Delta[i + 1] ) <= 0.1 | Abs( :Delta[i] - :Delta[i - 1] ) <= 0.1,
dtB:Check[i] = "Pass",
dtB:Check[i] = "Fail"
)
)
);
j'obtiens ce résultat
mais la ligne 5 ne devrait pas échouer
quand je le vérifie dans le journal, cela ressemble à un bogue ou il me manque quelque chose
apprécier vos contributions
je
/* :
5
//:*/
:Delta[i]
/* :
0,3
//:*/
:Delta[i+1]
/* :
0,4
//:*/
abs(:Delta[i] - :Delta[i+1])
/* :
0,1
//:*/
abs(:Delta[i] - :Delta[i+1]) <= 0.1
/* :
0
Études de consommation et de marchéIngénierie de la qualité et des procédésRe : Erreur d'état0,1 est une fraction répétitive en binaire. En virgule flottante IEEE, il est arrondi à 52 ou 53 bits, il doit donc être soit un peu trop grand, soit un peu trop petit.
Les bonnes fractions binaires sont des sommes de 1/2, 1/4, 1/8, 1/16, 1/32, ... 1/2^53 qui sont les bits individuels de la fraction.
Parfois, le « peu trop grand » ou le « peu trop petit » fonctionne comme vous le souhaitez, et parfois non.
Le deuxième exemple montre un epsilon choisi pour les nombres proches de 1, qui ont environ 14 décimales après la virgule (donc 1e-12).
If( .3 - .2 == .1, // "no"
"yes"
, // else
"no"
);
If( Abs( (.3 - .2) - .1 ) < 1e-12, // "yes"
"yes"
, // else
"no"
);
Ancien message
Re : Erreur d'étatce n'est pas un problème pour moi, j'aime faire ça
Re : Erreur d'étatLe problème est que la différence entre moins 0,4 et un positif 0,3 est de 0,7.L'absolu des valeurs est pris après le calcul !
Re : Erreur d'étatJMP Development a confirmé qu'il s'agissait simplement d'un problème numérique de précision finie. Les utilisateurs sont dérangés par les nombres à virgule flottante qui ne suivent pas les calculs (par exemple, la soustraction). JMP essaie de présenter le résultat tel qu'il est attendu, mais pas le résultat réel dans des cas comme le vôtre (c'est-à-dire 0,4 - 0,3). Ils ont suggéré d'utiliser également cette approche si vous voulez une meilleure vue du résultat réel :
Format( 0.1, "Fixed Dec", 20, 22 );
Format( 0.4-0.3, "Fixed Dec", 20, 22 );
Re : Erreur d'étatC'est votre erreur d'arrondi en virgule flottante de base.Ajoutez un epsilon et ça marche :
Deltai = 0.3;
Deltai1 = 0.4;
epsilon = .000000001;
print(abs(Deltai - Deltai1)); // = 0.1;
print(abs(Deltai - Deltai1) <= 0.1);
print(abs(Deltai - Deltai1) <= 0.1 + epsilon);
À partir du journal :
0.1
0
1
Re : Erreur d'étatUne autre chose à vérifier serait la différence entre diff et 0,1
diff - 0.1 = 2.77555756156289e-17;
donc "problème" de précision des nombres flottants ?
Round(diff, 1) == Round(0.1, 1) = 1;
Re : Erreur d'étatJe confirme cette erreur avec le code suivant (voir les résultats dans le journal):
/* Abs( 0.4 - 0.3) == 0.1; returns 0 or false */
y = 0.1; x1 = 0.4; x2 = 0.3; diff = x1 - x2;
Show( y, x1, x2, diff, diff == 0.1 );
Re : Erreur d'étatdésolé, je n'ai pas compris.
i = 5;
:Delta[i] = 0.3;
:Delta[i+1] = 0.4;
abs(:Delta[i] - :Delta[i+1]) = 0.1;
// but
abs(:Delta[i] - :Delta[i+1]) <= 0.1 // give me 0
pourquoi donc? aussi == donne moi 0, >= donne 1.
Re : Erreur d'étatJ'aime vérifier la correspondance de la valeur de la cellule (jusqu'à 0,1) des deux "côtés" n+1 et n-1 dans cette colonne. 1er et dernier rangs d'un côté.
merci
Re : Erreur d'étatabs(-0.4 - 0.3 ) = 0.7
abs(-0.4) - abs(0.3) = 0.1
Re : Erreur d'étatSi je comprends ce que vous essayez de faire, alors cette version simplifiée pourrait fonctionner :
For Each Row(
dtB:Check = If( Abs( :Delta - Lag(:Delta) ) <= 0.1, "Pass", "Fail" );
);