C ++で有効数字を含む数学を行うにはどうすればよいですか?私はこれが化学と物理学の実験からの測定データで正しく機能することを望んでいます。例:65/5 =10。不要な小数点以下の桁数を削除し、一部の数字を0に置き換える必要があります。
ありがとう!
C ++で有効数字を含む数学を行うにはどうすればよいですか?私はこれが化学と物理学の実験からの測定データで正しく機能することを望んでいます。例:65/5 =10。不要な小数点以下の桁数を削除し、一部の数字を0に置き換える必要があります。
ありがとう!
これにより、必要なものが得られるはずです。
std::cout.precision(x); // x would be the number of significant figures to output
これは最も効率的な方法ではないかもしれませんが、カスタムの有効数字データ型を作成できます。
class SigFigFloat
{
SigFigFloat(vector<short> digits, int decimalIndex, bool negative);
SigFigFloat operator+(const SigFigFloat &value);
SigFigFloat operator-(const SigFigFloat &value);
//etc...
}
大変な作業になる可能性がありますが、この権利を実装すると、有効数字を使用して計算を表現および実行するための非常に柔軟な方法になります。
有効数字は10進数の概念であり、コンピューターは2進数を話すため、これは困難です。10進数のクラス(私は何も知りません)を使用するか、boost::intervalを使用できます。これは確実に達成したいものに最も近いものです。
それはあなたがそれらをどのように表示しているかに依存します。printfファミリを使用している場合は、精度(sprintf(buffer, "%.2f", myfloat)
)を設定します。ostreamを使用している場合は、精度関数を呼び出して小数点以下の桁数を設定します。有効数字のより科学的な方法を探している場合は、フロートの現在の値に基づいて精度を決定するカスタム関数を作成する必要があります。
あなたもすることができます:
#define SIGNIFICANT_DIGITS 3
const float SIGNIFICANT_DIGITS_PWR = powf(10.0f, SIGNIFICANT_DIGITS);
float f;
std::cin >> f;
int int_digits = (int)log10f(f) + 1;
if (int_digits > 1) {
float prod = SIGNIFICANT_DIGITS_PWR / powf(10.0f, int_digits);
f = (float)(int)(f * prod) / prod;
} else {
f = (float)((int)(f * SIGNIFICANT_DIGITS_PWR)) / SIGNIFICANT_DIGITS_PWR;
};
std::cout << f << '\n';
出力:
0.1234
> 0.123
12.34
> 12.3
1234
> 1230
これが私のために働いた簡単な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;
math.hには優れた数学ライブラリがあります
また、フィギュアをフロート、ダブル、またはロングダブルに保存すると、より正確な操作が可能になります。
フロートは有効数字7桁を提供し、ダブルは有効数字16桁を提供します。
また、通常、印刷する場合は_snprintfまたはprintfを使用し、これらのdouble、floatを希望の精度にフォーマットできます。
フロート精度
printf( "値%8.2f"、floatVariable);
これは、合計8文字のフィールドが必要であることを示しています。8文字以内で、最後の2文字が小数部を保持します。
_snprintf(buffer、sizeof(buffer)、 "値%.2f"、floatVariable);
上記の例では、最小フィールド幅を要求し、最後の2文字は小数部を保持するためのものです。