2013-03-15 10 views
6

C++では、タイプの例は、のタイプがTで、整数型または浮動小数点型にすることができます。私は、があるTの最大番号yを探したいと思います。整数と浮動小数点数の両方で透過的に動作するように、ソリューションをテンプレート化する必要があります。 xが既にTで表すことができる最小の数である場合の端点の場合を無視することができます。最大の数<x?

使用可能なケース:この質問にはローカライズされているとマークされていますので、もっと一般的だと思うユースケースを提供したいと思います。私は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はすべて実数で計算するのは不可能です(少なくともかなりトリッキーです)。

enter image description here

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

コードを簡単にするために、開いた下限をシミュレートするために+0.1を使用しました。もちろん、0.1は、浮動小数点表記で値< z < =値+0.1または値+0.1 ==となるような値zが存在する可能性があるため、粗値である。 sizeof(LOWER_BOUND)が大きくなり、オペレータ()ニーズとしてしかし、これはあまり効率的である

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); } 

}; 

:ブレット・ヘイル答えは非常に便利です@ :)

したがって、あなたは別の簡単な解決策を考えることより複雑なステートメントを実行します。最初の実装は本当に効率的で、構造の代わりに単純なdoubleとして実装することもできます。技術的には、2番目の実装を使用する唯一の理由は、doubleが連続していると仮定しているのに対し、そうでないと仮定しているためです。

有効なユースケースを作成して説明し、元の著者に怒られていないことを願っています。あなたがC++ 11を持っている場合は

+1

を、あなたは、これは浮動小数点型のためにどのようになるかの例を与えることができますか?それは、yの仮数が1ビット小さく、指数が同じであることを意味しますか? – angelatlarge

+3

私は27.5kユーザー以上を期待しています。 –

+0

何か試しましたか? – Rapptz

答えて

11

、あなたは<cmath>std::nextafterを使用することができます。

if (std::is_integral<T>::value) 
    return (x - 1); 
else 
    return std::nextafter(x, - std::numeric_limits<T>::infinity()); 
+0

[x-1.0は浮動型のxと等しくなり、多くの数> _〜33554432](http ://coliru.stacked-crooked.com/view?id = cc0ae3f34df4c559275ba1290458f077-61c3814520a8d4318f681038dc4b4da7) –

+0

@MooingDuck - ありがとうございました。 uteエラー。 –

+0

@BrettHale:作るのが簡単ですが、私はそれもすべて自分のコードの上にあると確信しています。 –