1
printf("Elements of vector U:\n");
rprint_vector(u, n); 
double vt = dasum_(&n, u, &incx);
printf("vt = %lf\n", vt);

if (vt == 0)
    printf("yes vt = 0\n");
else
    printf("No vt != 0\n");

結果 :

Elements of vector U:
------------
0.000000
0.000000
-0.000000
0.000000
------------
vt = 0.000000
No vt != 0

変数 vt が 0 であっても、条件は満たされていません。問題はどこだ!!

4

1 に答える 1

2

これが有限精度表現の性質です。

固定精度の 10 進数表現との類似性を使用します。1/3 を として0.333333、2/ 3 を として表し0.666667ます。そうすれば2/3 - 1/3 - 1/3、結果は になります0.0000010.000これ以上数字を表示してもあまり意味がないので、おそらく と表示するでしょう。しかし、それは正確にゼロに等しいわけではありません。

浮動小数点数をそのように比較しないでください。わずかな不正確さでも答えが「はい」から「いいえ」に変わるからです。「非常に非常に近い」関数を書きたい場合は、そうしてください。

于 2018-05-11T20:46:45.443 に答える