0

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

例如,如果我有:

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

float d = a * b + c;

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

d = 16.7;

不是:

d = 16.71;

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

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

有没有一种自动的方法来修复精度?

4

2 回答 2

1

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

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

于 2012-10-08T22:54:48.500 回答
0

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

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

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

All that you are doing by rounding intermediate calculations accomplishes is to create an opening for errors to creep in and slowing the computer down, oftentimes by a quite a bit. Don't worry about the extra precision in those intermediate results. Simply use display the results to the desired precision on output.

The opposite problem sometimes does apply. You may need to worry about loss of precision in your intermediate results. Sometimes that loss of precision will mean changing from floats to doubles, or from doubles to variable precision arithmetic (which is slow).

于 2012-10-08T23:28:03.517 回答