C++ 设置操作的浮点精度

C++ 设置操作的浮点精度,c++,floating-point,C++,Floating Point,我正在寻找一种方法,迫使计算机计算一个浮点运算,并使用一组有效数字。这纯粹是为了学习,所以我不在乎结果的准确性 例如,如果我有: float a = 1.67; float b = 10.0; float c = 0.01 float d = a * b + c; 我希望每个数字都用3个有效数字表示,我希望看到: d = 16.7; 不是: 到目前为止,我得到了一个可能的答案: 但是,如果使用这种策略将每个浮点变量转换成精度达到我想要的精度,我的代码就会膨胀。然后对结果做同样的处理 是否有

我正在寻找一种方法,迫使计算机计算一个浮点运算,并使用一组有效数字。这纯粹是为了学习,所以我不在乎结果的准确性

例如,如果我有:

float a = 1.67;
float b = 10.0;
float c = 0.01

float d = a * b + c;
我希望每个数字都用3个有效数字表示,我希望看到:

d = 16.7;
不是:

到目前为止,我得到了一个可能的答案:

但是,如果使用这种策略将每个浮点变量转换成精度达到我想要的精度,我的代码就会膨胀。然后对结果做同样的处理


是否有自动确定精度的方法?

浮点数据类型是二进制浮点,即它们具有二进制数字的精度,实际上一般不可能精确表示十进制值。因此,将操作截断为正确的第一位小数位数时会出现一些问题。可行的方法是在每次操作后格式化浮点值,精度为
n
位(例如
n==3
),并将其转换回浮点值。这不会特别有效,但会起作用。为了避免将代码与相应的截断逻辑混在一起,您需要将所需的操作封装到一个类中,该类执行适当的截断结果的操作

或者,您可以使用有效位和适当的基数10指数来实现必要的逻辑。有效值将限制在-999和999之间的值。实现这样的类可能需要更多的工作,但结果可能会更有效

到目前为止,我得到了一个可能的答案:

阅读第二个答案,该答案获得10票,而不是被接受的答案,该答案只获得4票。不要这样做

当你在纸上计算时,你不想这样做,更不用说在计算机上了。这些中间计算最好至少对一个额外的有效数字进行,最好是两个或更多,而不是基础数据所显示的数字。您将截断到末端数据指示的精度。我们在纸上这样做的唯一原因是因为人们不太擅长处理大量的数字。这是一种短路操作,根据人们的计算方式(或错误计算)进行调整

通过对中间计算进行舍入,您所要做的就是为错误创建一个入口,从而使计算机运行速度降低,通常会降低相当一部分。不要担心中间结果的额外精度。只需使用在输出时以所需的精度显示结果


相反的问题有时确实适用。您可能需要担心中间结果的精度损失。有时,精度损失将意味着从浮点运算更改为双精度运算,或从双精度运算更改为可变精度运算(速度较慢)。

更改打印输出的精度是否足够,还是必须更改内存中值的精度?真正要考虑的是浮点类型的不准确开始(例如,甚至不能表示0.01):不,我需要在内存中考虑到的精度。例如:按照原始帖子中的情况,如果我将0.04添加到浮点变量d中,然后以精度3打印它(比如cout.setprecision(3);cout,确切地说,你为什么认为你需要这个?如果你是在使用货币,那么是的,这里有一些真实的问题,真实到你可能不想使用reals(浮动或双浮动)完全可以。你可能想要一个定点包。如果你在对数据进行有限精度的科学计算,这些中间结果最好保持比数据更高的精度。你不想对这些中间结果进行四舍五入。家庭作业。我被告知我必须这样做。我已经阅读了答案。我有怀疑它可能会减慢程序,但这并不重要。我需要做的是使用问题中给定的特定数量的有效数字进行计算。因此,例如,我可能有一个问题,告诉我必须计算尾数有4位的某个事物。这就是我需要设置精度的原因这样就不需要设置精度了。你需要的是最终结果显示出来。C风格输出(<代码> Prtff < /C>函数族)和C++风格输出(输出流,如代码> STD::CUT)提供了控制精度的机制。是的,这可能是我最终做的。谢谢。
d = 16.71;