如何在C ++中进行涉及重要数字的数学运算?我希望这与化学和物理实验的测量数据一致。例如:65/5 = 10.我需要摆脱不需要的小数位并用0替换一些数字。
谢谢!
答案 0 :(得分:7)
这可以满足您的需求:
std::cout.precision(x); // x would be the number of significant figures to output
答案 1 :(得分:4)
这可能不是最有效的方法,但您可以创建自定义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进行计算。
答案 2 :(得分:1)
很难,因为有效数字是十进制概念,计算机是二进制数。你可以使用十进制数字类(我不知道任何),或者使用boost::interval,这是你最接近你想要实现的目标。
答案 3 :(得分:1)
这取决于你如何展示它们。如果您使用的是printf-family,则可以设置精度(sprintf(buffer, "%.2f", myfloat)
)。如果使用ostreams,则调用precision函数来设置小数位数。如果您正在寻找更加科学的sig figs方法,您将必须编写一个自定义函数,根据浮动的当前值确定精度。
答案 4 :(得分: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;
答案 5 :(得分:0)
您还可以:
#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
答案 6 :(得分:-1)
有good math libraries in math.h
同时以浮动,双打或长双打存储您的数字将允许更精确的操作。
Floats提供7位有效数字,而双打提供16位有效数字。
同样在打印时通常人们使用_snprintf或printf,你可以格式化那些双打,浮动到你想要的精度:
浮动精度
printf(“Value%8.2f”,floatVariable);
这表示你需要总数 8个字符的字段,在8个字符内 最后2个将持有的字符 小数部分。
_snprintf(buffer,sizeof(buffer),“Value%.2f”,floatVariable);
上面的例子 请求最小字段宽度和 最后两个字符是要保留的 小数部分。