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

时间:2012-03-01 08:46:05

标签: c++ division

我想分割两个ull变量并获得最准确的结果。 最好的方法是什么?

即。 5000034/5000000 = 1.0000068

4 个答案:

答案 0 :(得分:5)

如果你想要“最准确的精度” - 你应该避免浮点算术。

你可能想要使用一些大的十进制库[whcih通常实现fixed point算术],并允许你定义你正在寻求的精度。

你应该避免浮点运算,因为它不是精确的[你有有限的位数来表示每个范围内的无限数量的数字,因此必须进行一些切片......]。定点运算[通常在大十进制库中实现]允许您“动态”分配更多位以表示所需精度的数字。 有关浮点问题的更多信息可以在[有点高级]文章中找到:What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:1)

代替(双)(N)/ D,做1 +((双)(N - D)/ D)

答案 2 :(得分:0)

我担心“最准确的结果”并不意味着 许多。没有有限的表示可以准确地表示所有实数; 表示的精确程度取决于类型的大小 及其内部代表。在大多数实现中,double将会 给出大约17个十进制数字的精度,通常是几个数量级 比输入更精确;对于单个乘法或除法, double通常很好。 (加法和减法出现问题 当两个值之间的差异极端时。)存在 提供更高精度的包(BigDecimalBigFloat和 喜欢),但它们永远不会精确:最终,精度受到限制 你愿意让他们使用的记忆量。他们也很多 慢于double,并且通常(稍微)更难以使用 正确(因为他们有更多的选择,例如,多少精度 你要)。您问题唯一真正的答案是另一个问题: 你需要多少精度?对于什么样的操作顺序? 舍入错误会累积,因此double可能足够大 对于单个部门,如果天真地使用它可能会导致问题 迭代程序。虽然在这种情况下,解决方案不是 通常是为了提高精度,但要以某种方式改变算法 避免这些问题。如果double为您提供所需的精确度, 使用它优先于任何扩展类型。如果没有,你就不这样做 有一个选择,然后选择一个现有的任意精度 库,例如GMP。

(处理舍入的方式可能也有问题 以簿记为目的,例如,大多数司法管辖区都非常严格 关于如何围绕单一价值观的法律及其规则是基于的 十进制算术。在这种情况下,您需要一个数字类型 进行十进制算术以使舍入符合所有 的情况。)

答案 3 :(得分:0)

浮点数可能对乘法和除法最准确,而整数和不动点数是加法和减法的最佳选择。这是因为乘法和除法改变了浮点数处理得更好的数量级,而加法和减法是某种步骤,整数和定点数处理得更好。

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