在C ++中获取大于或等于double(和最小值或相等)的最小float

时间:2013-12-10 09:19:14

标签: c++ c++11 double rounding

我正在用双精度3D物体制作加速结构(BVH)。为了提高内存效率,我希望BVH具有浮点精度。但我需要以下功能:

  • 获得最高或等于双倍的最低浮动
  • 获得最高浮点数低于或等于双倍

这些功能是否存在于标准c ++中? (C ++ 11)

由于

2 个答案:

答案 0 :(得分:5)

看起来你正在寻找nextafter/nexttoward功能。

你仍然需要围绕这个构建一些逻辑,但这应该为你提供“逐步”表示值所需的构建块。


也许(未经测试)尝试这样的事情:

float get_float(double d)
{
    long double const x = d;

    for (float f1 = d, f2 = f1; ; f2 = f1)
    {
        f1 = std::nexttoward(f2, x);
        if (f1 == f2) { return f1; }
    }
}

答案 1 :(得分:2)

没有内置功能。一些快速实验表明 的是:

float fLower = d;
float fUpper = d;
if ( fLower < d ) {
    fUpper = nextafterf( fUpper, FLT_MAX );
} else if ( fUpper > d ) {
    fLower = nextafterf( fLower, -FLT_MAX );
} 

似乎适用于g ++;在我的小试验中,我没有找到它 必要的,但更一般地说,你可能需要使用 -ffloat-store选项,至少在启用优化时。

值得一提的是:nextafter函数 仅在C ++ 11中添加到C ++中,并且通常不受支持 作为C ++函数(例如包括后的std::nextafter <cmath>)。 如果编译器也支持C99(如g ++那样), 然后你可以通过包括<math.h>和by来找到它们 将它们视为C函数。包括调用nextafterf, 正如我上面所做的那样,而不是依赖于功能过载 结果找到floatnextafter。而如果, 像微软,编译器不支持C99,他们可能不支持 在场。 (它们不存在于VS 2012中,因为 例如。)鉴于此,您最安全的解决方案可能是获得 gcc C库的源代码,并提取你的代码 需要。 (注意,IIUC,您必须将您的代码置于GPL之下 如果你这样做。)