11

実際、私はC++で範囲式に取り組んでいます。だから私が欲しいのは私が次のような表現を持っているかどうかです

x<1

それから私の

double getMax(...);

数直線で1.000(倍精度)の直前のdouble値を返す必要があります。

私はこれをやってみました

double getMax(double& a)
{
    return (a-numeric_limits<double>::min());
}

しかし、私はまだinreturnステートメントと同じ値を取得しています。

私はC++がcoutステートメントでそれを最も近いdoubleに変換していると思います。

int main()
{
    double a = 32;
    cout<<scientific<<getMax(a)<<endl;
    return 0;
}

出力:

3.200000e+001
4

2 に答える 2

10

まず、すべての表現可能な値が表示されるように、実際に十分な数の桁を印刷する必要があり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なしでアクセスできる場合があります。

于 2013-02-26T07:28:31.843 に答える
0

私はあなたが正しい考えを持っていると思います。ストリーム(ios_base ::precision)を使用せずにdoubleの精度を設定することを確認してください。質問についてはそれほど多くはありませんが、使用例については確認してprecisionください。53の精度で印刷するようなものを試してみることをお勧めします。

私が通常「近いが完全ではない」と見る方法には、差のしきい値(通常はイプシロンと呼ばれます)を設定することが含まれます。その場合、getMax関数は使用しませんが、使用量が未満の場合はイプシロンを使用します。(イプシロン値と演算子のオーバーロードを使用してクラスを実行できます。私は、ペストのように演算子のオーバーロードを回避する傾向があります。)

基本的に、次のものが必要です。

bool lessThanEpsilon(double number, double lessThan, double epsilon)
{
    return (lessThan - number >= epsilon);
}

もちろん、他の種類もあります。等しいはチェックしますif Math.abs(number - equals) < epsilon

于 2013-02-26T07:28:27.537 に答える