C++ 在C+中,使最小的浮点值大于或等于双精度浮点值(以及最大的浮点值小于或等于双精度浮点值)+;

C++ 在C+中,使最小的浮点值大于或等于双精度浮点值(以及最大的浮点值小于或等于双精度浮点值)+;,c++,c++11,double,rounding,C++,C++11,Double,Rounding,我正在用双精度3D对象制作一个加速结构(BVH)。为了提高内存效率,我希望BVH采用浮点精度。但我需要以下功能: 使最低浮点数更高或等于双精度浮点数 将最高浮点数降低或等于双精度浮点数 这些函数是否存在于标准C++中?(c++11) 谢谢看起来您正在寻找功能 您仍然需要围绕此构建一些逻辑,但这应该为您提供“逐步通过”可表示值所需的构建块 也许(未经测试)可以尝试以下方式: float get_float(double d) { long double const x = d;

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

  • 使最低浮点数更高或等于双精度浮点数
  • 将最高浮点数降低或等于双精度浮点数
这些函数是否存在于标准C++中?(c++11)


谢谢

看起来您正在寻找功能

您仍然需要围绕此构建一些逻辑,但这应该为您提供“逐步通过”可表示值所需的构建块


也许(未经测试)可以尝试以下方式:

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; }
    }
}

看起来您正在寻找函数

您仍然需要围绕此构建一些逻辑,但这应该为您提供“逐步通过”可表示值所需的构建块


也许(未经测试)可以尝试以下方式:

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; }
    }
}

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

float fLower=d;
浮球浮球=d;
如果(花d){
花=下一次(花,-FLT_MAX);
} 
似乎与g++一起工作;在我的小型试验中,我没有找到它 必要,但更一般地说,您可能需要使用
-ffloat store
选项,至少在启用优化的情况下

但是,有一点值得一提:
nextafter
函数 只在C++ 11中添加到C++中,一般不支持 作为C++函数(例如:代码> STD::NEXTAFFTER < /代码> >
)。如果编译器也支持C99(就像g++一样), 然后,您可以通过包含
,以及 将它们视为C函数。包括调用下一步, 正如我在上面所做的,而不是依赖于函数重载 查找
nextafter
float
版本的结果。如果, 与Microsoft一样,编译器不支持C99,它们可能不支持 根本不在场。(例如,他们在VS 2012中没有出现。) 鉴于此,您最安全的解决方案可能是获得 gcc C库的源代码,并提取您需要的代码 需要(注意IIUC,您必须将代码置于GPL之下
如果您这样做。)

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

float fLower=d;
浮球浮球=d;
如果(花d){
花=下一次(花,-FLT_MAX);
} 
似乎与g++一起工作;在我的小型试验中,我没有找到它 必要,但更一般地说,您可能需要使用
-ffloat store
选项,至少在启用优化的情况下

但是,有一点值得一提:
nextafter
函数 只在C++ 11中添加到C++中,一般不支持 作为C++函数(例如:代码> STD::NEXTAFFTER < /代码> >
)。如果编译器也支持C99(就像g++一样), 然后,您可以通过包含
,以及 将它们视为C函数。包括调用下一步, 正如我在上面所做的,而不是依赖于函数重载 查找
nextafter
float
版本的结果。如果, 与Microsoft一样,编译器不支持C99,它们可能不支持 根本不在场。(例如,他们在VS 2012中没有出现。) 鉴于此,您最安全的解决方案可能是获得 gcc C库的源代码,并提取您需要的代码 需要(注意IIUC,您必须将代码置于GPL之下
如果你这样做。)

是的,使用
std::numeric\u limits::epsilon()
和一个转换(或隐式转换)。是的,使用
std::numeric\u limits::epsilon()
和一个转换(或隐式转换)。是吗?这些似乎都不符合他的要求:给定一个
double
(精确值),他想要两个浮点数(可能是相同的)来最好地框定它。@JamesKanze:如果从double转换为float,那你就站在一边了,在after/atrow中,你将一步移到另一边?@JamesKanze:在将double转换为float之后,可以使用这些函数来获得所需的值。在将double d四舍五入为float f1之后,测试f1==d。如果是,请完成。如果不是,那么另一个边界就是下一个边界(f1,d)。@PatriciaShanahan:这并不容易,因为你只能比较同一类型的两个对象。但是你可以回到double,利用double可以表示浮动的事实(至少在IEEE754上是这样),是吗?这些似乎都不符合他的要求:给定一个
double
(精确值),他想要两个浮点数(可能是相同的)来最好地框定它。@JamesKanze:如果从double转换为float,那你就站在一边了,在after/atrow中,你将一步移到另一边?@JamesKanze:在将double转换为float之后,可以使用这些函数来获得所需的值。在将double d四舍五入为float f1之后,测试f1==d。如果是,请完成。如果不是,那么另一个边界就是下一个边界(f1,d)。@PatriciaShanahan:这并不容易,因为你只能比较同一类型的两个对象。但是你可以回到double,利用double可以表示浮动的事实(至少在IEEE754上是这样)。谢谢,我会试试的。我使用的是gcc,但我想保持代码的可移植性,因此查看gcc libc源代码只会给出一个实现,我可能最终会分解浮点尾数/指数,然后自己做这项工作,这不是更具移植性,但不是GPL限制的汉克斯,我会尝试一下。我使用的是gcc,但我希望保持代码的可移植性,因此查看gcc libc源代码只会给出一个实现,我可能最终分解浮点尾数/指数并自己完成这项工作,这不是更具移植性,但不受GPL限制