我试图弄清楚如何将负无穷大的值赋给float或double变量。似乎包括标准库限制,我可以获得无穷大表示,并且我知道(非常肯定)在前面添加一个减号(-infinity)可能会导致我在IEEE754浮点中寻找的值标准(因为0x7FFFFFFF可能会导致0xFFFFFFFF),但我甚至不确定,更不用说可能存在的其他标准(如果有的话)。我发现它真的,非常不专业和依赖于实现。
当然,有一种很好的方法可以独立获得负无限平台和实现的价值,否则我也可以使用#define,每个人都喜欢预处理。
答案 0 :(得分:29)
至少std::numeric_limits::is_iec559(IEEE 754)是真的(保证std::numeric_limits::has_infinity也是如此),你可以用你已经说过的方式表达正负无穷大值。
来自Wikipedia的IEEE 754-1985无穷大值的简短说明:
...... ......剪断
偏置指数字段用全1位填充以指示其中任何一个 无穷大或无效的计算结果。
正负无效
因此表示正负无穷大:
sign = 0 for positive infinity, 1 for negative infinity. biased exponent = all 1 bits. fraction = all 0 bits.
...... ......剪断
<强>断言强>
以下示例将按预期工作,或者在目标平台不支持IEEE 754浮点数时导致编译时错误。
#include <cstdlib>
#include <cmath>
#include <cassert>
#include <limits>
int main(void)
{
//Asserts floating point compatibility at compile time
static_assert(std::numeric_limits<float>::is_iec559, "IEEE 754 required");
//C99
float negative_infinity1 = -INFINITY;
float negative_infinity2 = -1 * INFINITY;
float negative_infinity3 = -std::numeric_limits<float>::infinity();
float negative_infinity4 = -1 * std::numeric_limits<float>::infinity();
assert(std::isinf(negative_infinity1) && negative_infinity1 < std::numeric_limits<float>::lowest());
assert(std::isinf(negative_infinity2) && negative_infinity2 < std::numeric_limits<float>::lowest());
assert(std::isinf(negative_infinity3) && negative_infinity3 < std::numeric_limits<float>::lowest());
assert(std::isinf(negative_infinity4) && negative_infinity4 < std::numeric_limits<float>::lowest());
return EXIT_SUCCESS;
}
答案 1 :(得分:7)
如果std::numeric_limits<double>::is_iec559
为true
,那么使用它应该是安全的 -
double negative_infinity = - std::numeric_limits<double>::infinity();
(IEC559是ISO754的ISO等效物)
如果它是false
那么还有很多工作要做,因为我认为C ++标准不会给你任何帮助。
答案 2 :(得分:5)
我不知道您使用的是什么编译器,但您可以在gcc和MinGw上使用-std::numeric_limits<double>::infinity()
,请参阅Infinity-and-NaN。我还在MSVC上运行了以下代码,它返回true:
double infinity(std::numeric_limits<double>::infinity());
double neg_infinity(-std::numeric_limits<double>::infinity());
double lowest(std::numeric_limits<double>::lowest());
bool lower_than_lowest(neg_infinity < lowest);
std::cout << "lower_than_lowest: " << lower_than_lowest << std::endl;
但是,考虑使用应用程序中的最低值而不是负无穷大,这可能是值得的,因为它可能会产生更便携的解决方案。