pla*_*cel 8 c++ visual-c++ constexpr c++11
由于std:ceil是非constexpr既不在Visual Studio 2015年,我正在寻找一个constexpr它的实现,我可以使用编译时间-收效甚微.
任何帮助表示赞赏.
由于Visual Studio 2015的编译器仍然不允许constexpr函数具有if条件和变量,因此我重写了Jarod42的解决方案并将其删除:
constexpr int32_t ceil(float num)
{
return (static_cast<float>(static_cast<int32_t>(num)) == num)
? static_cast<int32_t>(num)
: static_cast<int32_t>(num) + ((num > 0) ? 1 : 0);
}
Run Code Online (Sandbox Code Playgroud)
你可以用
constexpr std::int32_t ceil(float num) {
std::int32_t inum = static_cast<std::int32_t>(num);
if (num == static_cast<float>(inum)) {
return inum;
}
return inum + (num > 0 ? 1 : 0);
}
Run Code Online (Sandbox Code Playgroud)
注意:一旦整数不能表示浮点值,则不起作用.
这是一个基于Jarod42 的优秀答案构建的版本,消除了两个分支之一。这将适用于 C++14 或 C++17\xe2\x80\x94,如果您内联整数转换,则也可以使其支持 C++11。
\nconstexpr int int_ceil(float f)\n{\n const int i = static_cast<int>(f);\n return f > i ? i + 1 : i;\n}\nRun Code Online (Sandbox Code Playgroud)\n这是一个用于验证正确行为的小套件。(只是一系列 C++17 static_assert(),因为函数是constexpr\xe2\x80\x94 如果它编译,你就知道测试通过了!)
static_assert(int_ceil(0.0) == 0);\nstatic_assert(int_ceil(0.5) == 1);\nstatic_assert(int_ceil(0.999999) == 1);\nstatic_assert(int_ceil(1.0) == 1);\nstatic_assert(int_ceil(123.0) == 123);\nstatic_assert(int_ceil(123.4) == 124);\n\nstatic_assert(int_ceil(-0.5) == 0);\nstatic_assert(int_ceil(-0.999999) == 0);\nstatic_assert(int_ceil(-1.0) == -1);\nstatic_assert(int_ceil(-123.0) == -123);\nstatic_assert(int_ceil(-123.4) == -123);\nRun Code Online (Sandbox Code Playgroud)\n这是一个可供使用的编译器资源管理器示例(作为奖励,它还包括一个constexpr实现floor())。
| 归档时间: |
|
| 查看次数: |
2874 次 |
| 最近记录: |