C++ では、整数型または浮動小数点型x
の型がいくつかあるとします。成立する型のT
最大数を見つけたい。ソリューションは、整数と浮動小数点数の両方で透過的に機能するようにテンプレート化する必要があります。で表すことができる最小の数値がであるエッジ ケースは無視できます。y
T
y < x
x
T
考えられるユースケース:この質問はあまりにもローカライズされているとマークされているため、より一般的だと思われるユースケースを提供したいと思います。私は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 が連続的であると想定しているからですが、そうではなく、予見可能な将来のどこにもないと思います。
有効なユースケースを作成して説明したこと、および元の作成者を怒らせなかったことを願っています.