まず、すべての表現可能な値が表示されるように、実際に十分な数の桁を印刷する必要がありdouble
ます。これは次のように実行できます(これを確認してください#include <iomanip>
)。
std::cout << std::scientific << std::setprecision(std::numeric_limits<double>::max_digits10) << getMax(a) << std::endl;
第二に、numeric_limits<>::min
これには適切ではありません。開始値が1.0
である場合は、を使用できますnumeric_limits<double>::epsilon
。これは、表現可能なものとの最小の差1.0
です。
ただし、コード例では、開始値は32
です。イプシロンは必ずしもそのために機能するとは限りません。この場合、正しいイプシロンを計算することは困難です。
ただし、C ++ 11 (*)cmath
を使用できる場合は、ヘッダーに必要なことを実行する関数がありstd::nextafter
ます。
#include <iostream>
#include <limits>
#include <iomanip>
#include <cmath>
double getMax(double a)
{
return std::nextafter(a,std::numeric_limits<double>::lowest());
}
int main()
{
double a = 32;
std::cout << std::scientific
<< std::setprecision(std::numeric_limits<double>::max_digits10)
<< getMax(a)
<< std::endl;
return 0;
}
私もそれをliveworkspaceに置きました。
説明する:
double nextafter(double from, double to);
fromの次の表現可能な値をtoの方向に返します。そこで、引数よりも小さいstd::numeric_limits<double>::lowest()
次の表現可能な値を確実に取得するように、呼び出しで指定しました。
(*)以下のTonyDのコメントを参照してください。nextafter()
C++11なしでアクセスできる場合があります。