如何在编译时获取大浮点数的下限

问题描述 投票:0回答:1

我正在使用 c++20 编写一个编译时数学库,我已经有地板/天花板/绝对值/等。但我目前用来获取浮动下限的方法是

n >= 0.0f ? (float)(long long)n : (float)(long long)n - 1.0f;
,这是一个非常典型的快速下限函数。但是,对于大于 long long 最大值的浮点数,这会返回垃圾,因为我转换为 long long。我知道使用 Floorf 适用于大型浮点数,但它不是 constexpr (直到 c++23 仍处于预览状态)。然而我不能仅仅复制 stl 正在做的事情,因为它调用一个内部函数,而它本身不是 constexpr。任何可以为我指明正确方向的信息将不胜感激。

c++ visual-c++ floating-point c++20 floor
1个回答
0
投票

正如 @chtz 和 @IgorTandetnik 所说,浮点数足够大,大于 long long 最大值,无法存储小数部分,因此只需返回输入即可。

对于浮标:

if(abs(n) > (float)(1 << 23))
{
    return n;
}
else
{
    return n >= 0.0f ? (float)(long long)n : (float)(long long)n - 1.0f;
}

对于双打:

if(abs(n) > (double)(1 << 52))
{
    return n;
}
else
{
    return n >= 0.0 ? (double)(long long)n : (double)(long long)n - 1.0;
}
© www.soinside.com 2019 - 2024. All rights reserved.