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

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

它应该在“float.h”中。 这是可移植的,它是C和C ++标准的一部分(虽然在C ++中已被弃用 – 使用或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更高的精度,在这种情况下,您获得的结果比DBL_EPSILON更小。 检查编译器手册,或者找到一种方法来强制存储1.0 + d/2的值并将其重新加载到实际的double对象,然后再将其与1.0进行比较。 非常粗略地说,在PC上,它取决于您的编译器是使用x86 FPU指令(更高精度)还是更新的x64浮点运算(双精度)。

在C ++中,它是std::numeric_limits::epsilon()