タイトルはかなりわかりやすく、入力は倍の値が与えられています。最も近い次の/前の倍の値を見つける方法(与えられた数値に対してnumeric_limits ::εを見つける方法)
答えて
あなたのコンパイラはC99の数学関数/ C++ 11を実装している場合、あなたはnextafter
を使用することができます。
#include <cfloat> // DBL_MAX
#include <cmath> // std::nextafter
double x = 0.1;
// next representable number after x in the direction of DBL_MAX
double xPlusSmallest = std::nextafter(x, DBL_MAX);
あなたのコンパイラは、おそらく、それをそれをサポートしていない場合でも、それには本質的なものがあります。あなたのコンパイラがそれをサポートしていない場合
を(。。MSVCは、GCCは、おそらく標準としてそれを実装して、たとえば、2005年から_nextafter
があった)が、ブーストは、あなたがこれを行うことができ、あなたに提供されています:
#include <boost/math/special_functions/next.hpp> // boost::float_next
double x = 0.1;
// next representable number after x
double xPlusSmallest = boost::math::float_next(x);
この(エミュレートC99)に相当する:
#include <boost/math/special_functions/next.hpp> // boost::nextafter
#include <cfloat> // DBL_MAX
double x = 0.1;
// next representable number after x in the direction of DBL_MAX
double xPlusSmallest = boost::math::nextafter(x, DBL_MAX);
そして、あなたのためにそれらの作品のどれも、あなたはそれをオープンブーストヘッダをクラックしてコピーする必要がないだろう場合。
素敵な答えをありがとう、ブーストを使用して私はそれの方法を使用します。 – kovarex
#define FLT_MIN 1.175494351e-38F /* min positive value */
#define FLT_MAX 3.402823466e+38F /* max value */
#define DBL_MIN 2.2250738585072014e-308 /* min positive value */
#define DBL_MAX 1.7976931348623158e+308 /* max value */
OPが望んでいると思います最小/最大値ではなく、2つの浮動小数点数の間に可能な最小の差*を知ることができます。 –
でも最小値がfloat.hファイル –
@AlexZKに格納されている値よりも小さい値を示しています。それはFPUによって異なります。私が与えたリンクは、FPUが処理できる精度を示しています。そして、私は最小の違いが処理できる最小の正の値になると感じます。 –
あなたのプラットフォームがIEEE754 floatを使用している場合にのみ実際には有効ではない非常に汚いトリックです:floatのバイナリ表現はfloat値と同じ方法で順序付けられているため、バイナリ表現を増やすことができます:
double x = 1.25;
uint64_t * const p = reinterpret_cast<uint64_t*>(&x);
++*p; // undefined behaviour! but it gets the next value
// now x has the next value
あなたは適切なuint64_t
値を得るために、通常のバイナリコピーの体操をすることによって、完全に合法的に同じ効果を得ることができます。ゼロ、無限大、NaNも正しくチェックしてください。
GCCは型間の 'memcpy'をできるだけエイリアスに置き換えてくれると聞いてきましたが、それは単なる神話かもしれません。 – GManNickG
これは正しく仮数のオーバーフローを処理しますか?バイナリ表現が.111111111 * 2^kの場合はどうなりますか? .00000000 * 2^{k + 1}か? –
@Alexandre C:はい、そうです。 – user763305
方法について:
x += fabs(x) * std::numeric_limits<double>::epsilon();
タイプごとに掛け算しますか? – GManNickG
あなたが ':: min()'を追加することを意図していたとすれば、これは非正規化数に対しては機能せず、通常の場合の証明が必要です。 IEEE 754は、乗算と加算の下でULPについて何を保証しますか?私は '1.5 * 2^n≦x <2^n + 1 'という数値は乗算後に希望のイプシロンの倍になると考えていますが、これは融合積和演算で動作するはずです。 – Potatoswatter
おっと - ipsilonを書くのを忘れた... –
- 1. 与えられた出力で最大値を見つける
- 2. データベースに最も近い数値を見つける
- 3. 与えられた色の近くの色を見つける
- 4. 整数フィールドにない最小値を見つける方法
- 5. アトリビュートの値を見つける方法
- 6. as3:Box2d最も近い身体を見つける方法
- 7. 最も近いチェックボックスの値を見つける
- 8. 最も近いラジオボタンセットの値を見つける
- 9. 与えられたintに最も近い偶数を見つける方法は? (与えられた11のリターン12)
- 10. javascript/jquery - 配列に最も近い値を見つける
- 11. 変数の最大値を見つける方法
- 12. 最も近いCCSpriteを見つける
- 13. mongodb - 最も近い整数値を持つ文書を見つける
- 14. Excelで日付に対する値を見つける方法
- 15. datarow []内の列の最大値を見つける方法?
- 16. 辞書の「最初の」値を見つける方法は?
- 17. 配列の最大値を見つける方法は?
- 18. intのセリフで可能な最も低い値を見つける方法は?
- 19. 与えられたデータから現在の場所から最も近い場所を見つける方法を教えてください。
- 20. 最近gitでファイルのコミッターを見つける方法は?
- 21. 最も近い点のペアを素早く見つける方法
- 22. ディレクトリから最も古いファイルを見つける方法??? (PHP)
- 23. データポイントのセットが与えられた場合、「最も近い」ものを見つけよう
- 24. クリックしたポイントに最も近い項目を見つける
- 25. クラス名に基づいて以前のドロップダウン値を見つける方法
- 26. Emacs:その値で変数を見つける方法?
- 27. 文字列の数値パターンを見つける方法
- 28. ベクトルのリストから最も近いベクトルを見つける| Python
- 29. コンマ区切りの列から値を見つける方法
- 30. 1つのクエリで最も近い日付を見つける
'ダブル次回=値+のstd :: numeric_limitsの ::イプシロン()work'でしょうか?または私は何かを逃している? –
rve
@rve:ある時点では、値の増加が停止します(効果はありません)。これは、最初に入力した値が正確に保存されない新しい値に近似しているためです。だから、あなたは次の数字に達していないというループで立ち往生してしまいます。 – GManNickG
@rve、いいえ、値1の倍数のイプシロンであるため、イプシロンはより大きい数値で大きくなります。http://en.wikipedia.org/wiki/Double-precision_floating-point_format – kovarex