如何处理C中的浮点运算精度

时间:2009-09-16 12:20:24

标签: c floating-point

在编程竞赛中,浮点运算相关问题说“错误是答案必须小于1e-6”或“答案必须正确到6位小数”。这是否意味着我可以在不担心精度的情况下对FP变量执行计算,并且只有在打印时我应该像

一样编写
printf("%.6lf",a);

我理解正确吗?以上2个引号是否意味着同样的事情? 在其中一个问题中,当我使用双数组并执行一些计算并打印其中一个数组元素时。它打印“-0.000000”。这是什么意思? 但是当我在C ++中使用矢量时

vector<double> arr(10,0.0);

相同的计算打印“0.000000”。为什么会有这样的差异?

6 个答案:

答案 0 :(得分:2)

如果精度需要6位小数,请至少使用一个双精度数。根据您正在进行的浮点计算量,蝴蝶效应很容易影响您的答案。

浮点数的IEEE标准已经签名为零。 see here

答案 1 :(得分:2)

1e-06的错误是0.000001,影响小数的第6位,但我认为只有一个学生会坚持这两个引号之间存在差异。 (我是一个,需要一个人知道)

将准确度保持在6位小数的要求可能是为了提醒您计算的准确性仅与计算中使用的最小精确数字一样多。

因此,如果使用3.1416作为PI,则无法计算圆周长度为6位小数,无论您测量半径的准确程度如何

答案 2 :(得分:2)

准确性不仅取决于所使用的类型,还取决于您计算事物的

例如,您想要计算:

1e9 + 1e-9 - 1e9

正确的答案应该是1e-9,但是按顺序执行时,1e-9在添加到1e9时会丢失并给出0。

使用float或double是不够的,以确保获得正确的6位数。您必须估计每一步可能出现的错误。

您应该阅读Numerical analysis

答案 3 :(得分:1)

在浮点运算中,算术符号不是数字的一部分,因此同时存在-0和0。

答案 4 :(得分:1)

没有办法知道浮动是否足够,或者你是否必须使用bool甚至更好的精度;一些算法可以快速破坏精度。例如,通过总结渐近系列来计算值,您可以达到任何太低精度(即5或15位数)简单地爆炸的点。您可以阅读有关此类内容的信息,例如in this blog post

在那篇博客文章中,为什么他的“浮动”(Python float = double precision)会失败但是自己的例程会失败吗?他的例程不仅可以使用任意精度,而且还可以监控计算,以便在错误增加时增加精度。只有这样才能确定。

答案 5 :(得分:0)

  

Blockquote上面的2个引号是否意思相同?

显然不是。 1-e6表示您的答案必须在.000001之内。 6位精度意味着即使答案是12345689,12345678也是正确的。差异远远大于.0000001。现在,如果您的答案是.100001(正确的答案是.100000)那么它们就是一样的。