ZustandsfehlerHallo
Ich versuche, eine Deltaprüfung zwischen benachbarten Zellenwerten in derselben Spalte durchzuführen.
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"
)
)
);
Ich bekomme dieses Ergebnis
aber Zeile 5 sollte nicht scheitern
Wenn ich es anhand des Protokolls überprüfe, scheint es ein Fehler zu sein oder ich übersehe etwas
Vielen Dank für Ihre Beiträge
ich
/*:
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
Verbraucher- und MarktforschungQualitäts- und VerfahrenstechnikBetreff: Bedingungsfehler0,1 ist ein sich wiederholender Bruch im Binärformat. Im IEEE-Gleitkomma wird es auf 52 oder 53 Bit gerundet, es muss also entweder etwas zu groß oder etwas zu klein sein.
Gute binäre Brüche sind Summen von 1/2, 1/4, 1/8, 1/16, 1/32, ... 1/2^53, also den einzelnen Bits des Bruchs.
Manchmal funktioniert das „etwas zu groß“ oder „etwas zu klein“ wie gewünscht, manchmal aber auch nicht.
Das zweite Beispiel zeigt ein Epsilon, das für Zahlen nahe 1 gewählt wurde, die etwa 14 Nachkommastellen haben (also 1e-12).
If( .3 - .2 == .1, // "no"
"yes"
, // else
"no"
);
If( Abs( (.3 - .2) - .1 ) < 1e-12, // "yes"
"yes"
, // else
"no"
);
Alter Beitrag
Betreff: BedingungsfehlerFür mich ist das kein Problem, das mache ich gerne
Betreff: BedingungsfehlerDas Problem besteht darin, dass die Differenz von minus 0,4 zu positiv 0,3 0,7 beträgt.Die absoluten Werte werden nach der Berechnung ermittelt!
Betreff: BedingungsfehlerJMP Development bestätigte, dass es sich lediglich um ein numerisches Problem mit endlicher Präzision handelt. Benutzer werden durch Gleitkommazahlen gestört, die nicht der Mathematik folgen (z. B. Subtraktion). JMP versucht, das Ergebnis wie erwartet darzustellen, in Fällen wie Ihrem jedoch nicht das tatsächliche Ergebnis (z. B. 0,4 - 0,3). Sie schlugen vor, auch diesen Ansatz zu verwenden, wenn Sie einen besseren Überblick über das tatsächliche Ergebnis erhalten möchten:
Format( 0.1, "Fixed Dec", 20, 22 );
Format( 0.4-0.3, "Fixed Dec", 20, 22 );
Betreff: BedingungsfehlerDas ist Ihr grundlegender Gleitkomma-Rundungsfehler.Fügen Sie ein Epsilon hinzu und es funktioniert:
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);
Aus dem Protokoll:
0.1
0
1
Betreff: BedingungsfehlerEine weitere zu überprüfende Sache wäre der Unterschied zwischen diff und 0,1
diff - 0.1 = 2.77555756156289e-17;
Also „Problem“ mit der Genauigkeit der Gleitkommazahl?
Round(diff, 1) == Round(0.1, 1) = 1;
Betreff: BedingungsfehlerIch bestätige diesen Fehler mit dem folgenden Code (Ergebnisse im Protokoll anzeigen):
/* 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 );
Betreff: BedingungsfehlerEntschuldigung, ich habe es nicht verstanden.
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
Warum das? auch == gib mir 0, >= gib mir 1.
Betreff: BedingungsfehlerIch überprüfe gerne die Übereinstimmung der Zellenwerte (bis zu 0,1) auf beiden „Seiten“ n+1 und n-1 in dieser Spalte. 1. und letzte Reihe auf einer Seite.
Danke
Betreff: Bedingungsfehlerabs(-0,4 - 0,3) = 0,7
abs(-0,4) - abs(0,3) = 0,1
Betreff: BedingungsfehlerWenn ich verstehe, was Sie tun möchten, könnte diese vereinfachte Version funktionieren:
For Each Row(
dtB:Check = If( Abs( :Delta - Lag(:Delta) ) <= 0.1, "Pass", "Fail" );
);