メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C++:2008 Rule 6-2-2

Floating-point expressions shall not be directly or indirectly tested for equality or inequality.

説明

ルール定義

Floating-point expressions shall not be directly or indirectly tested for equality or inequality. 1

根拠

浮動小数点数では丸め誤差が生じるため、浮動小数点数が等価であることを正確に比較する方法がありません。これは、等価性の直接的なテストの場合も間接的なテストの場合も同様です。浮動小数点数の比較で等価であることが予期される場合、誤った結果となる可能性があります。この動作は予測不能であり、実装に応じて異なる可能性があります。

等価比較での浮動小数点数の使用を避けてください。あるいは、比較演算を実装するライブラリを作成します。このライブラリの作成時には、比較する数値の大きさと、浮動小数点の粒度を考慮してください。

Polyspace 実装

ルール チェッカーは、浮動小数点型の変数または式での == または != の使用を検出します。また、ルール チェッカーは浮動小数点型の変数の等価性または非等価性の間接テストも検出します。以下に例を示します。

float x, y = 0.0;
if ((x < y) || (x > y))           //Noncompliant
{
    //...
}

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

次のコードに、浮動小数点数の比較のさまざまな例を示します。Polyspace は、浮動小数点の等価性または非等価性のテストごとに違反を報告します。

  • x == y (== を使用しているため)

  • x == 0.0f (!= を使用しているため)

  • ((x <= y) && (x >= y)) (間接的な等価比較のため)

  • ((x < y) || (x > y)) (間接的な非等価比較のため)

#include <cmath>
#include <limits>

void main()
{
    float x, y = 0.0;
    if (x == y)          //Noncompliant
    {
        //...
    }
    if (x != 0.0f)       //Noncompliant
    {
        //...
    }
    if ((x <= y) && (x >= y))         //Noncompliant
    {
        //...
    }
    if ((x < y) || (x > y))           //Noncompliant
    {
        //...
    }
}

チェック情報

グループ: Statements
カテゴリ: 必要

バージョン履歴

R2013b で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.