如何(便携)在C / C ++中获取DBL_EPSILON

时间:2009-10-14 13:23:25

标签: c++ c

我在Linux(AS 3)上使用GCC 3.4并试图找出DBL_EPSILON,或者至少是一个不错的近似值。我怎样才能以编程方式获得它?

2 个答案:

答案 0 :(得分:28)

在C ++中它是std::numeric_limits<double>::epsilon()

答案 1 :(得分:27)

它应该在“float.h”中。这是可移植的,它是C和C ++标准的一部分(虽然在C ++中已被弃用 - 使用<cfloat>或sbi的答案是为了“保证”前向兼容性)。

如果你没有它,那么由于你的双打是IEEE 64位,你可以从其他人的float.h中偷取这个值。这是我发现的第一个:

http://opensource.apple.com/source/gcc/gcc-937.2/float.h

#define DBL_EPSILON 2.2204460492503131e-16

该值看起来对我而言,但如果您想确定编译器,可以检查(1.0 + DBL_EPSILON) != 1.0 && (1.0 + DBL_EPSILON/2) == 1.0

编辑:我不太确定“编程”是什么意思。它是一个标准常量,你不应该计算它,它是在头文件中给你的实现的属性。但我猜你可以这样做。再次,假设IEEE表示或类似的东西,使得DBL_EPSILON必然是0.5的幂表示1.0的表示精度的最后一位精度为1:

double getDblEpsilon(void) {
    double d = 1;
    while (1.0 + d/2 != 1.0) {
        d = d/2;
    }
    return d;
}

请注意,根据编译器设置,中间结果的精度可能高于double,在这种情况下,d的结果比DBL_EPSILON小。检查编译器手册,或者找到一种方法来强制1.0 + d/2的值存储并重新加载到实际的double对象,然后再将其与1.0进行比较。非常粗略地说,在PC上,它取决于您的编译器是使用x86 FPU指令(更高精度)还是更新的x64浮点运算(双精度)。