C++ 有效数字

问题描述 投票:0回答:7

如何在 C++ 中进行涉及有效数字的数学运算?我希望它能够正确处理化学和物理实验的测量数据。一个例子:65 / 5 = 10。我需要去掉不需要的小数位并用 0 替换一些数字。

谢谢!

c++ math rounding significant-digits
7个回答
9
投票

这应该可以满足您的需求:

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

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 表示和进行计算。


1
投票

这很难,因为有效数字是十进制概念,而计算机讲的是二进制。您可以使用十进制数字类(我不知道任何),或使用 boost::interval,这是最接近您想要实现的目标。


1
投票

这取决于您如何显示它们。如果您使用 printf 系列,则可以设置精度 (

sprintf(buffer, "%.2f", myfloat)
)。如果您使用 ostreams,则调用 precision 函数来设置小数位数。如果您正在寻找更科学的 sig Figs 方法,则必须编写一个自定义函数来根据浮点数的当前值确定精度。


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;

0
投票

现在 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);
}

-3
投票

math.h 中有很好的数学库

还将数字存储在浮点数、双精度数或长双精度数中将允许更精确的操作。

浮点数提供 7 位有效数字,而双精度数字提供 16 位有效数字。

来源

此外,在打印时,通常人们使用 _snprintf 或 printf,您可以格式化这些双精度数,浮点数到您想要的精度,例如:

浮动精度

printf("值%8.2f", floatVariable);

这表示您需要总计 8 个字符的字段,在 8 最后 2 个字符将保存 小数部分。

_snprintf(buffer, sizeof(buffer), "值 %.2f", floatVariable);

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

© www.soinside.com 2019 - 2024. All rights reserved.