我正在用双精度3D物体制作加速结构(BVH)。为了提高内存效率,我希望BVH具有浮点精度。但我需要以下功能:
这些功能是否存在于标准c ++中? (C ++ 11)
由于
答案 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
,
正如我上面所做的那样,而不是依赖于功能过载
结果找到float
版nextafter
。而如果,
像微软,编译器不支持C99,他们可能不支持
在场。 (它们不存在于VS 2012中,因为
例如。)鉴于此,您最安全的解决方案可能是获得
gcc C库的源代码,并提取你的代码
需要。 (注意,IIUC,您必须将您的代码置于GPL之下
如果你这样做。)