ある浮動小数点数から次の浮動小数点数に正確にループしようとしています。言ってやるが、私はからループする必要があるstd::numeric_limits<float>::epsilon()
と1
の両方正確に表現IEEE754の数字です。私のコードは:
using nld = std::numeric_limits<float>;
auto h = nld::epsilon();
for (; h < 1; h = std::nextafter(h, 1)) {
std::cerr << "h: " << h << std::endl;
}
hは正確に表現可能であるため、どのループが無期限にループするので、それnextafter
を返し続けます。また、ループ内のhにマシンイプシロンを追加してもカットされないことも知っています。浮動小数点数は等間隔ではありません。IEEE754番号の正確な表現をループするにはどうすればよいですか?
not equally spaced
ここでの問題は、それ自身を示します:
using nld = std::numeric_limits<float>;
auto h = nld::epsilon();
for (; h < 4; h += nld::epsilon()) {
if (h = h + nld::epsilon()) {
std::cerr << "h: " << h << std::endl;
}
}
2
私のために印刷し続けます
コメントによると:
のアプローチnextafter
はまさにあなたがすべきことです。ただし、予期しない結果につながる可能性のあるいくつかの問題があります。
cppreferenceの引用std::nextafter
:
float nextafter( float from, float to );
(1)(C ++ 11以降)
double nextafter( double from, double to );
(2)(C ++ 11以降)
long double nextafter( long double from, long double to );
(3)(C ++ 11以降)
Promoted nextafter( Arithmetic from, Arithmetic to );
(4)(C ++ 11以降)..。
4)(1-3)でカバーされていない算術型の引数のすべての組み合わせに対するオーバーロードのセットまたは関数テンプレート。いずれかの引数が整数型の場合、それはにキャストされ
double
ます。引数がの場合long double
、戻り値の型Promoted
もですlong double
。それ以外の場合、戻り値の型は常にdouble
です。
あなた以来to
IS 1
、タイプのint
、あなたはの戻り値の型と、過負荷バージョン4を取得しますdouble
。さて、フロートを与えていることは完全に可能だf
、(float)nextafter((double)f, 1)
まさにオリジナルと同じであるf
:それはかなり可能性が高いタイプの次の表現可能数がいることだdouble
では表現できないfloat
、との変換バックすることをfloat
ラウンドダウン。
返される唯一のオーバーロードfloat
は、to
タイプがのオーバーロードですfloat
。そのオーバーロードを使用する1.0f
には、の代わりにを使用し1
ます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加