java - 浮点数如何比较是否相等或者如何判断某个浮点数是否为0?
天蓬老师
天蓬老师 2017-04-18 10:18:47
0
3
1927

大家应该都知道浮点数存在精度问题,所以问题就来了,我如何才能判断两个数是否近似相等,或者某个浮点数是否为0。
其实这是一个问题,对于前者,我们需要二者作差,然后与0进行比较。这样前者与后者就是同一个问题了,即如何判断某个浮点数是否为0。我所知道的比较简单但是不是很好的方法就是使用1e-7或者更小的数,如下所示(以单精度为例):

#include <iostream>
#include <cfloat>

using namespace std;

int main()
{
    float num;

    cout << "输入一个数:";
    cin >> num;

    if (num < 1e-7 && num > -1e-7)
        cout << num << "近似为0" << endl;
    else
        cout << num << "不近似为0" << endl;

    return 0;
}

上述方式以C++代码为例。由于不同编程语言有不同的处理方式,大家可以不限制使用任何编程语言。当然,如果您有更通用的方式当然再好不过了。

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全員に返信(3)
洪涛

「十分小さい」とはどれくらい小さいかは、扱われている特定の問題によって決定される必要があります。たとえば、金額を表すために double を使用する場合、1e-4 はゼロと見なすことができます。科学計算の場合、1e-7 はおそらく大きすぎます。 double表示金额的话,1e-4就可以认为是零了。而如果进行科学计算,恐怕1e-7还嫌太大。

<cfloat>中有定义DBL_EPSILON为与1.0

<cfloat> は、DBL_EPSILON1.0 に最も近い違いとして定義します。ここを参照してください。 🎜
いいねを押す +0
PHPzhong

浮動小数点数は 2 進数で格納され、10 進数を表すために 2 進数を使用すると正確に表現できないため、浮動小数点数の比較は実際の格納規則に基づく必要があります。小さいため、バイナリ で正確に表現できない場合があります。なぜ? まず、浮動小数点数の小数点以下の桁数を2進数で表すと、
小数点以下1桁:0.5(2^-1)
小数点以下2桁:0.25(2^-2)
...
n小数点以下の桁数: 2 ^-n
つまり、
浮動小数点数の小数部は 2^-1...2^-n で構成されます。そのため、浮動小数点数が有効桁数の少ない理由が理解できます。たとえば、0.3 のように正確に表現できる場合、上記の数字の組み合わせを使用して正確に表現することはできません。 cout が信じられない場合は、次のように試してみてください。 リーリー 出力: 0.30000001192092896

そして、0.3 を 0.5 に置き換えても問題ありません。0.5 は 2^-1 で正確に表現できるからです。同様に0.625でもOKです。

では、なぜ通常は cout cout がデフォルトで丸め処理を行っているためです
元の投稿者の質問に戻ります: 0.3 == 0.3 を直接判断しても問題ありません。同じ数値は同じ表現を持つため、「==」を直接使用できます。これは、0 など、正確に表現できる数値の場合に特に当てはまります。

しかし、0.1+0.2 と 0.3 が等しいかどうかを判断したい場合、それは機能しません。どちらにも精度の損失があり、損失の値が異なるため、直接比較することはできず、次のことが必要です。

のようなメソッドを使用します。

いいねを押す +0
Peter_Zhu

浮動小数点数 (float または double 型) のコンピューター表現には精度制限があり、精度制限を超える浮動小数点数の場合、コンピューターは精度を超えた小数部分を切り捨てます。したがって、もともと等しくない 2 つの浮動小数点数がコンピュータ内で等しくなる場合があります。例:

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート