1. ホーム
  2. c++

[解決済み] FLT_MAX、FLT_MINはなぜ正負の無限大ではないのですか、また、その用途は何ですか?

2022-03-13 08:31:24

質問

論理的に言えば、浮動小数点値の性質から、表現可能な最大値と最小値は float はそれぞれ正の無限大と負の無限大です。

では、なぜ FLT_MAXFLT_MIN を設定しないのですか?これは"規格がそう呼んだだけ"であると理解しています。しかし、それなら 使用 かもしれない FLT_MAX または FLT_MIN の表現可能な数値範囲の中間に位置しているためです。 float ? 他の数値制限は、比較に関する保証を行うため、ある程度の実用性があります(例えば、"No INT can test greater than INT_MAX")。このような保証がない場合、これらの浮動小数点数の制限はどのように使用されるのでしょうか?

C++の動機となる例です。

#include <vector>
#include <limits>

template<typename T>
T find_min(const std::vector<T> &vec)
{
    T result = std::numeric_limits<T>::max();
    for (std::vector<T>::const_iterator p = vec.start() ; p != vec.end() ; ++p)
        if (*p < result) result = *p;
    return result;
}

このコードはTが整数型であれば問題なく動作しますが、浮動小数点型であれば動作しません。 これは迷惑な話だ。 (そうそう、標準ライブラリは min_element しかし、それは問題ではありません。 重要なのは パターン .)

解決方法は?

の目的は FLT_MIN / MAX は、表現可能な浮動小数点の最小値と最大値が何であるかを伝えるものです。 数値 があります。無限大は数ではなく、限界値です。

FLT_MAXとFLT_MINは、現在、floatの表現可能な数値範囲の中央に位置しているため、どのような用途があるのでしょうか。

にあるわけではありません。 ミドル を表現可能な範囲とする。正のフロート値は存在しない x に追加することができます。 FLT_MAX で、表現可能な数値が得られます。あなたは、+INFを取得します。これは、先に述べたように、数字ではありません。

このコードはTが整数型であれば問題なく動作しますが、浮動小数点型であれば動作しません。これは迷惑な話だ。(そうそう、標準ライブラリはmin_elementを提供しているが、それが重要なのではない。ポイントはパターンです)。

そして、どのようにうまくいかないのでしょうか?唯一うまくいかないのは、テーブルの中に のみ +INFです。そしてその場合でも、実際の エラーコードではありません。いずれにせよ、これはより良い選択でしょう。