如何在 C++ 中进行涉及有效数字的数学运算?我希望它能够正确处理化学和物理实验的测量数据。一个例子:65 / 5 = 10。我需要去掉不需要的小数位并用 0 替换一些数字。
谢谢!
这应该可以满足您的需求:
std::cout.precision(x); // x would be the number of significant figures to output
这可能不是最有效的方法,但您可以创建自定义 sig Fig 数据类型。
class SigFigFloat
{
SigFigFloat(vector<short> digits, int decimalIndex, bool negative);
SigFigFloat operator+(const SigFigFloat &value);
SigFigFloat operator-(const SigFigFloat &value);
//etc...
}
这可能需要大量工作,但如果你正确实现这一点,它可能是一种非常灵活的方式来用 sig Figs 表示和进行计算。
这很难,因为有效数字是十进制概念,而计算机讲的是二进制。您可以使用十进制数字类(我不知道任何),或使用 boost::interval,这是最接近您想要实现的目标。
这取决于您如何显示它们。如果您使用 printf 系列,则可以设置精度 (
sprintf(buffer, "%.2f", myfloat)
)。如果您使用 ostreams,则调用 precision 函数来设置小数位数。如果您正在寻找更科学的 sig Figs 方法,则必须编写一个自定义函数来根据浮点数的当前值确定精度。
这是一个对我有用的快速 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;
现在 C++20 已正式推出其库,您可以在 C++ 中获得 printf 格式
#include <iostream>
#include <format>
int main()
{
long double d = 0.1 + 0.2;
std::cout << std::format("{:0.63f}\n", d);
}
math.h 中有很好的数学库
还将数字存储在浮点数、双精度数或长双精度数中将允许更精确的操作。
浮点数提供 7 位有效数字,而双精度数字提供 16 位有效数字。
此外,在打印时,通常人们使用 _snprintf 或 printf,您可以格式化这些双精度数,浮点数到您想要的精度,例如:
浮动精度
printf("值%8.2f", floatVariable);
这表示您需要总计 8 个字符的字段,在 8 最后 2 个字符将保存 小数部分。
_snprintf(buffer, sizeof(buffer), "值 %.2f", floatVariable);
上面的例子 请求最小字段宽度和 最后两个字符要保留 小数部分。