-
25-09-2019 - |
質問
どのように私はC ++の有効数字を含む数学を行うことができますか?私は、これは化学と物理学の実験からの測定データを正しい仕事をしたいです。例は:5分の65 = 10.私は不要な小数点以下の桁数を取り除くために必要があると0でいくつかの数字を置き換えます。
ありがとうございます。
解決
また山車、ダブルスまたは長いダブルスであなたの数字を格納することは、より正確な操作が可能になります。
ダブルスは、16桁の有効数字を提供しながら、フロートは、7桁の有効数字を提供します。
ソースの
プリントアウト時にまた、普通の人が_snprintfかのprintfを使用すると、あなたは次のようにしたい精密にそれらのダブルス、山車をフォーマットすることができます:
フロート精密
のprintf( "値%8.2f"、floatVariable)。
これは、合計を必要と述べています 8内の8文字のフィールド、 文字の最後の2を開催します 小数部。
_snprintf(バッファのsizeof(バッファ)、 "値%.2f"、floatVariable)。
上記の例 最小フィールド幅を要求し、 最後の2つの文字は保留にされています 小数部分ます。
他のヒント
これはあなたが必要なものを取得する必要があります:
std::cout.precision(x); // x would be the number of significant figures to output
このは、最も効率的な方法ではないかもしれないが、あなたはカスタムSIGのイチジクのデータ型を作成することができます。
class SigFigFloat
{
SigFigFloat(vector<short> digits, int decimalIndex, bool negative);
SigFigFloat operator+(const SigFigFloat &value);
SigFigFloat operator-(const SigFigFloat &value);
//etc...
}
それは多くの作業することができますが、あなたがこの権利を実装する場合、それが表すとSIGのイチジクで計算を行うには、本当に柔軟な方法することができます。
それは難しいです。あなたは(私は知らない)進数のクラスを使用、または使用<のhref = "http://www.boost.org/doc/libs/1_45_0/libs/numeric/interval/doc/interval.htmすることができます「REL =」nofollowを ">ブースト::間隔に、あなたは確かに達成したいものに最も近います。
それはあなたがそれらを表示している方法によって異なります。あなたはprintf関数ファミリを使用している場合は、精度(sprintf(buffer, "%.2f", myfloat)
)を設定します。あなたがostreamsを使用している場合は、小数点以下の桁数を設定するには、高精度の関数を呼び出します。あなたはSIGのイチジクのより科学的な方法を探しているなら、あなたはフロートの電流値に基づいて精度を決定するカスタム関数を記述する必要があります。
ここでは私のために働いた迅速なC ++ 11のソリューションです
int sig_figs = 3;
double number = 1562.654478;
std::cout << "original number:" << number << std::endl;
number = ([number](int number_of_sig_figs)->double{
std::stringstream lStream;
lStream << std::setprecision(number_of_sig_figs) << number;
return std::stod(lStream.str());
})(sig_figs);
std::cout << "rounded number:" << number << std::endl;