條件錯誤你好
我正在嘗試在同一列上的相鄰單元格值之間進行增量檢查。
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"
)
)
);
我得到這個結果
但第 5 行不應該失敗
當我通過日誌檢查它時,它似乎是一個錯誤或者我遺漏了一些東西
感謝您的投入
我
/*:
5
//:*/
:德爾塔[i]
/*:
0.3
//:*/
:德爾塔[i+1]
/*:
0.4
//:*/
絕對值(:Delta[i] - :Delta[i+1])
/*:
0.1
//:*/
絕對值(:Delta[i] - :Delta[i+1]) <= 0.1
/*:
0
消費者和市場研究質量和工藝工程回复:條件錯誤0.1 是二進制的重複分數。 在 IEEE 浮點中,它以 52 或 53 位舍入,因此它要么太大要么太小。
好的二進制分數是 1/2、1/4、1/8、1/16、1/32、... 1/2^53 的和,它們是分數的各個位。
有時“有點太大”或“有點太小”會按照您想要的方式工作,有時則不然。
第二個示例顯示為接近 1 的數字選擇的 epsilon,該數字在小數點後大約有 14 位(即 1e-12)。
If( .3 - .2 == .1, // "no"
"yes"
, // else
"no"
);
If( Abs( (.3 - .2) - .1 ) < 1e-12, // "yes"
"yes"
, // else
"no"
);
舊帖子
回复:條件錯誤這對我來說不是問題,我喜歡這樣做
回复:條件錯誤問題是負 0.4 到正 0.3 之間的差異是 0.7。計算後取絕對值!
回复:條件錯誤JMP Development 證實這只是一個有限精度數值問題。 用戶會被不遵循數學運算(例如減法)的浮點數所困擾。 JMP 會嘗試顯示預期的結果,但在像您這樣的情況下不會顯示實際結果(即 0.4 - 0.3)。 如果您想更好地了解實際結果,他們建議也使用這種方法:
Format( 0.1, "Fixed Dec", 20, 22 );
Format( 0.4-0.3, "Fixed Dec", 20, 22 );
回复:條件錯誤這是基本的浮點舍入誤差。添加一個 epsilon 就可以了:
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);
從日誌中:
0.1
0
1
回复:條件錯誤還要檢查的另一件事是 diff 和 0.1 之間的差異
diff - 0.1 = 2.77555756156289e-17;
那麼浮點數精度“問題”?
Round(diff, 1) == Round(0.1, 1) = 1;
回复:條件錯誤我使用以下代碼確認此錯誤(在日誌中查看結果):
/* 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 );
回复:條件錯誤抱歉,沒聽懂。
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
這是為什麼?另外 == 給我 0,>= 給我 1。
回复:條件錯誤我喜歡檢查此列中 n+1 和 n-1 兩側的單元格值匹配(最多 0.1)。 一側的第一排和最後一排。
謝謝
回复:條件錯誤絕對值(-0.4 - 0.3 ) = 0.7
絕對值(-0.4) - 絕對值(0.3) = 0.1
回复:條件錯誤如果我明白你想要做什麼,那麼這個簡化版本可能會起作用:
For Each Row(
dtB:Check = If( Abs( :Delta - Lag(:Delta) ) <= 0.1, "Pass", "Fail" );
);