我正在寻找一种方法来强制计算机计算具有一定数量有效数字的浮点运算。这是出于纯粹的学习原因,所以我不关心结果中准确性的损失。
例如,如果我有:
float a = 1.67;
float b = 10.0;
float c = 0.01
float d = a * b + c;
我希望每个数字都包含3位有效数字,我希望看到:
d = 16.7;
不
d = 16.71;
到目前为止,我将此作为一个可能的答案:Limit floating point precision?
但它会使我的代码膨胀,以便使用该策略将每个浮点变量转换为我想要的精度。然后对结果做同样的事情。
是否有自动修复精度的方法?
答案 0 :(得分:1)
浮点数据类型是二进制浮点,即,它们具有二进制数字的精度,并且实际上不可能精确地表示十进制值。因此,您将首先将操作截断为正确的小数位数。可行的方法是在每次操作后格式化浮点值,精度为n
位数(例如n == 3
)并将其转换回浮点值。这不会特别有效,但可行。为了避免使用相应的截断逻辑乱丢代码,您可以将所需的操作封装到一个类中,该类操作会适当地截断结果。
或者,您可以使用有效数和适当的基数10指数来实现必要的逻辑。重要性将被限制在介于-999和999之间的值。实现这样的类可能更多的工作,但结果可能更有效。
答案 1 :(得分:0)
到目前为止,我将此作为一个可能的答案:Limit floating point precision?
阅读第二个答案,获得十票,而不是接受的票,只获得四票。 不要这样做。
当你在纸上进行计算时,你不想这样做,更不用说在计算机上了。这些中间计算最好对至少一个额外的有效数字进行,最好是两个或多个,比基础数据所示。您将截断到最后数据指示的精度。我们在纸面上这样做的唯一原因是因为人们不善于处理大量数字。这是一种短路操作,可以根据人们计算(或误算)的方式进行调整。
通过舍入中间计算完成的所有工作就是创建一个错误的开口,以便逐步降低计算机速度,通常需要相当多。不要担心这些中间结果的额外精度。只需使用结果显示输出所需的精度。
相反的问题有时也适用。您可能需要担心中间结果的精度损失。有时,精度的损失将意味着从浮点数变为双精度,或从双精度变为可变精度算术(慢)。