2011-01-05 36 views
6

C++で有効数字を含む数学を行うにはどうすればよいですか?私はこれを、化学および物理実験の測定データで正確に動作させたい。例:65/5 = 10.不必要な小数点以下の桁を取り除き、いくつかの桁を0に置き換える必要があります。C++の有効数字

ありがとうございます!

+7

5、5.0、5.00000000は、コンピュータの表現で同じです。 2人の有効数字で結果を*表示する方法について話していますか? – kennytm

+0

はい、ありがとうございます。私はそれを言うために自分の投稿を編集します。 – joshim5

+1

私は3.5 * 1.0 * 3.1を使って3.5 * 1.00 * piの計算をしたいと思っています。(混乱しない限り) –

答えて

-1

まあまた山車、ダブルスまたは長いダブルスであなたの数字を格納すると、より正確な操作が可能になりますgood math libraries in math.h

があります。

浮動小数点数は7桁で、倍数は16桁です。

source

通常、人々は_snprintfかのprintfを使用していて、それらのダブルスをフォーマットすることができますをプリントアウトする際にも、あなたが好きな希望精度に浮かぶ:

フロート精密

のprintf( "値%8.2f "、floatVariable);

これは、合計 フィールドが8文字であることを示しています。最後の2文字は、 小数部を保持します。

_snprintf(buffer、sizeof(buffer)、 "Value%.2f"、floatVariable);

上記の例では、 がフィールドの最小幅を要求し、 の最後の2文字は小数部の を保持します。

+5

これらは「有効数字」ではなく「小数点以下の桁」です(https://en.wikipedia.org/wiki/Significant_figures)。科学者とエンジニアにとって、両者の間には非常に重要な違いがあります。 – bdesham

6

これは、あなたが必要なものを取得する必要があります:

std::cout.precision(x); // x would be the number of significant figures to output 
+0

私は次のように書く:cout.precision(2)< <5.34343;私が5.3を表示したければ? – joshim5

+0

正解 - ここにドキュメントがあります:http://www.cplusplus.com/reference/iostream/ios_base/precision/ –

1

有効数字は小数点概念であり、コンピュータがバイナリを話すので、それは難しいです。 10進数のクラスを使用することはできますが(私には分かりません)、確かに達成したいものに最も近いのはboost::intervalです。

+0

+1ここでは余計かもしれませんが、インターバル算術を提案するには+1、それについてはまだ知っておく価値があります:) –

4

これは最も効率的な方法ではないかもしれませんが、カスタムシグネチャデータタイプを作成することができます。

class SigFigFloat 
{ 
    SigFigFloat(vector<short> digits, int decimalIndex, bool negative); 
    SigFigFloat operator+(const SigFigFloat &value); 
    SigFigFloat operator-(const SigFigFloat &value); 
    //etc... 


} 

それは多くの作業することができますが、あなたがこの権利を実装する場合、それが表現する、本当に柔軟な方法であるとSIGのイチジクで計算を行うことができます。

+0

私がこれをやっていたのであれば、有意な数字だけを追跡するのではなく、有効範囲の数だけでなくエラーの範囲も追跡していました。それは私が123±0.2や123±0.7のような数字で働くことを可能にしますが、有効数字は123±0.5 – Steve

1

どのように表示しているかによって異なります。 printf-familyを使用している場合は、精度(sprintf(buffer, "%.2f", myfloat))を設定します。 ostreamsを使用している場合は、小数点以下桁数を設定するprecision関数を呼び出します。より科学的なシグネチャのメソッドを探しているなら、フロートの現在の値に基づいて精度を決定するカスタム関数を書く必要があります。ここ

0

が私のために働いた迅速な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; 
関連する問題