まず、実際に十分多くの桁を印刷して、表現可能なすべての値が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
です。イプシロンは必ずしもそのためには機能しません。この場合の右イプシロンの計算は困難です。
#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の上に置かれている:あなたがC++ 11 を使用できるかどう
ただし、(*)は、cmath
ヘッダ内の関数を使用すると、std::nextafter
が必要なものないものがあります。説明する
:
double nextafter(double from, double to);
を
はの方向からの次の表現可能な値を返します。だから私はstd::numeric_limits<double>::lowest()
を指定して、次の表現可能な値を確実に受け取って、引数を以下にしました。
(*)下記のTony Dのコメントを参照してください。 nextafter()
にC++ 11を使用せずにアクセスできます。
「getMax」は開いている間隔には意味がなく、[getSup'](http://en.wikipedia.org/wiki/Supremum)は1を正確に返す必要があります。 –