C ++有意义的数字

时间:2011-01-05 17:58:24

标签: c++ math rounding significant-digits

如何在C ++中进行涉及重要数字的数学运算?我希望这与化学和物理实验的测量数据一致。例如:65/5 = 10.我需要摆脱不需要的小数位并用0替换一些数字。

谢谢!

7 个答案:

答案 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位有效数字。

source

同样在打印时通常人们使用_snprintf或printf,你可以格式化那些双打,浮动到你想要的精度:

  

浮动精度

     

printf(“Value%8.2f”,floatVariable);

     

这表示你需要总数   8个字符的字段,在8个字符内   最后2个将持有的字符   小数部分。

     

_snprintf(buffer,sizeof(buffer),“Value%.2f”,floatVariable);

     

上面的例子   请求最小字段宽度和   最后两个字符是要保留的   小数部分。

相关问题