6

C++ では、整数型または浮動小数点型xの型がいくつかあるとします。成立する型のT最大数を見つけたい。ソリューションは、整数と浮動小数点数の両方で透過的に機能するようにテンプレート化する必要があります。で表すことができる最小の数値がであるエッジ ケースは無視できます。yTy < xxT

考えられるユースケース:この質問はあまりにもローカライズされているとマークされているため、より一般的だと思われるユースケースを提供したいと思います。私はOPのオリジナルの作者ではないことに注意してください。

次の構造を検討してください。

struct lower_bound {
    lower_bound(double value, bool open) : value(open? value+0.1 : value) {}
    double value;
    bool operator()(double x) { return x >= value; }
};

このクラスは、オープンまたはクローズの下限をシミュレートします。もちろん、実際の (しゃれが意図された) 生活では、これを行うことはできません。Sがすべて実数である場合、流れを計算することは不可能です (または、少なくとも非常にトリッキーです) 。

ここに画像の説明を入力

ただし、Sが浮動小数点数の集合である場合、本質的に可算集合を扱っているため、これは非常に有効な原則です。そして、開いた境界や閉じた境界などはありません。つまり、>= は、lower_bound クラスで行われるように > で定義できます。

コードを簡単にするために、+0.1 を使用して開いた下限をシミュレートしました。もちろん、浮動小数点表現で value < z <= value+0.1 または value+0.1 == value となるような値 z が存在する可能性があるため、0.1 は粗い値です。したがって、@ brett-haleの回答は非常に便利です:)

別のより簡単な解決策を考えることができます:

struct lower_bound {
    lower_bound(double value, bool open) : open(open), value(value) {}
    bool open;
    double value;
    bool operator()(double x) { return (open ? x > value : x>=value); }

};

ただし、sizeof(Lower_bound) が大きく、operator() がより複雑なステートメントを実行する必要があるため、これは効率が低下します。最初の実装は非常に効率的で、構造体ではなく単純に double として実装することもできます。技術的には、2 番目の実装を使用する唯一の理由は、double が連続的であると想定しているからですが、そうではなく、予見可能な将来のどこにもないと思います。

有効なユースケースを作成して説明したこと、および元の作成者を怒らせなかったことを願っています.

4

1 に答える 1

10

std::nextafterC++11 を使用している場合は、次のように使用できます<cmath>

if (std::is_integral<T>::value)
    return (x - 1);
else
    return std::nextafter(x, - std::numeric_limits<T>::infinity());
于 2013-03-15T19:18:23.920 に答える