如何在C中设置double数据类型变量的精度?

时间:2012-07-05 14:41:54

标签: c

  

可能重复:
  Most effective way for float and double comparison

在我的程序中,一些双变量采用1.00000001形式的值。使用1对这些变量进行等式检查显然会失败。

我想知道如何降低c中double类型变量的精度,以便与整数相等。

5 个答案:

答案 0 :(得分:3)

您几乎不应该检查浮点值是否完全相等,特别是当它们来自计算时。您应该检查比较值小于某个epsilon的差异的绝对值。 double的“精度”由内部数字表示给出,您无法更改它。 如何准确地选择epsilon可能很困难,对于那个讨论的答案有一些评论,阅读它,但你最终会得到基于epsilon的实用平等。

答案 1 :(得分:2)

没有可移植的方式,没有。

使用GNU C库,您可以使用this API更改舍入模式。

但总的来说,最好用代码来表达它,这样你的期望就会变得清晰和便携:

#define EQUALITY_EPSILON 1e-3  /* Or whatever. */

if(fabs(x - y) <= EQUALITY_EPSILON)
{
}

答案 2 :(得分:1)

您应该避免在浮点比较中检查是否相等。相反,使用精度值epsilon,如下所示:

if (fabs(a - b) < epsilon)
{
    // treat a and b as equal
}

ε的选择可能很复杂,但我的知识并没有那么远。

Google搜索“每个程序员应该知道的关于浮点算术的内容”。这是一篇涵盖所有这些内容的知名文章。

答案 3 :(得分:0)

“降低双重型变量的精度”没有多大意义。您应该考虑使用ceilfloorround之类的函数,而不是以您可以很好地控制的方式从double中生成一个整数,然后使用该整数在你的比较中。

答案 4 :(得分:0)

在C99

#include <stdio.h>
#include <math.h>

int main(){
    double d = 1.00000001;
    int i = (int)round(d);

    printf("%d\n", i);

    return 0;
}