设置操作的浮点精度

Set floating point precision for operations

本文关键字:精度 操作 设置      更新时间:2023-10-16

我正在寻找一种方法来强制计算机计算具有一定数量有效数字的浮点运算。这纯粹是出于学习的原因,所以我不在乎结果的准确性损失。

例如,如果我有:

float a = 1.67;
float b = 10.0;
float c = 0.01
float d = a * b + c;

我希望每个数字都用3个有效数字表示,我希望看到:

d = 16.7;

不是:

d = 16.71;

到目前为止,我得到了一个可能的答案:限制浮点精度?

但是,使用该策略将每个浮点变量转换为一个具有我想要的精度的变量会使我的代码膨胀。然后对结果做同样的事情。

有没有自动修正精度的方法?

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

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

到目前为止,我得到了一个可能的答案:限制浮点精度?

阅读获得10票的第二个答案,而不是仅获得4票的已接受答案不要这么做。

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

通过对中间计算进行四舍五入,你所做的就是为错误的蔓延创造一个机会,并使计算机速度减慢,通常会慢很多。不要担心那些中间结果的额外精度。只需使用即可在输出时显示所需精度的结果。

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