繁体   English   中英

cpp部门-如何获得最准确的结果?

[英]cpp division - how to get most accurate outcome?

我想将两个ull变量除以得到最准确的结果。 最好的方法是什么?

即5000034/5000000 = 1.0000068

如果要“最精确的精度”,则应避免使用浮点运算。

您可能想使用一些大的十进制库[通常实现定点算法],并且可以定义所需的精度。

您应该避免使用浮点算术,因为它们不是精确的[您有有限的位数来表示每个范围内的无限数量的数字,因此必须进行某些切片...]。 定点算法(通常在大十进制库中实现)允许您“动态”分配更多位以表示所需精度的数字。
有关浮点问题的更多信息,请参见这篇[有点高级]文章: 每位计算机科学家都应了解的有关浮点算法的知识

代替(double)(N)/ D,而是做1 +((double)(N-D)/ D)

恐怕“最准确的结果”意义不大。 没有有限的表示可以精确地表示所有实数; 表示的精确度取决于类型的大小及其内部表示。 在大多数实现中, double精度将给出约17个十进制数字的精度,通常比输入精度高几个数量级。 对于单个乘法或除法,通常double精度即可。 (当两个值之间的差异极大时,会出现加减法的问题。)存在提供更高精度的软件包( BigDecimalBigFloat等),但它们从来都不是精确的:最终,精度受到您愿意让他们使用的内存量。 它们也比double慢得多,并且通常(略)难于正确使用(因为它们有更多选择,例如,您想要多少精度)。 您问题的唯一真实答案是另一个问题:您需要多少精度? 以及什么操作顺序? 四舍五入的误差会累积,因此,对于一个除法, double可能就足够了,但如果天真地将其用于迭代过程,则可能会引起问题。 尽管在这种情况下,解决方案通常不是提高精度,而是以避免问题的方式更改算法。 如果double为您提供所需的精度,请优先使用该扩展类型。 如果没有,则您没有选择的余地,则选择现有的任意精度库之一,例如GMP。

(您可能还对四舍五入的处理方式有疑问。例如,出于记账目的,大多数司法管辖区都有关于如何对整数值进行四舍五入的非常严格的法律,其规则基于十进制算术。在这种情况下,您会需要使用数字类型进行十进制算术运算,以便在所有情况下都可以四舍五入。)

浮点数对于乘法和除法可能是最准确的,而整数和定点数是加法和减法的最佳选择。 这是由于这样的事实,即乘法和除法会更改浮点数更好地处理的数量级,而加法和减法是某种步骤,整数和定点数会更好地处理。

如果要在除整数时获得最佳精度,请实现一个包含分子和分母的RationalNumber类。 这样,如果避免算术溢出,您的结果将始终是精确的。 这要求您接受小数形式的输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM