Set*_*r22 34 c++ numeric-limits
我试图弄清楚如何将负无穷大的值赋给浮点数或双变量.似乎包括标准库限制,我可以获得无穷大表示,并且我知道(非常肯定)在前面添加一个减号(-infinity)可能会导致我在IEEE754浮点中寻找的值标准(因为0x7FFFFFFF可能会导致0xFFFFFFFF),但我甚至不确定,更不用说可能存在的其他标准(如果有的话).我发现它真的,非常不专业和依赖于实现.
当然,有没有一种方法可以独立获得负无限平台和实现的价值,否则我也可以使用#define,每个人都喜欢预处理.
Sam*_*Sam 30
至少如果std :: numeric_limits :: is_iec559(IEEE 754)为真(这保证了std :: numeric_limits :: has_infinity也为真),你可以按照你已经陈述的方式表达正负无穷大值.
维基百科对IEEE 754-1985无穷大值的简短解释:
......喀嚓......
偏置指数字段用全1位填充以指示无穷大或无效的计算结果.
正负无穷大
因此表示正负无穷大:
Run Code Online (Sandbox Code Playgroud)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;
}
Run Code Online (Sandbox Code Playgroud)
如果std::numeric_limits<double>::is_iec559是true,那么它应该是安全的使用-
double negative_infinity = - std::numeric_limits<double>::infinity();
(IEC559是ISO754的ISO等效物)
如果是false那么还有很多工作要做,因为我不认为C++标准会给你任何帮助.
我不知道您使用的是什么编译器,但是您可以-std::numeric_limits<double>::infinity()在gcc和MinGw上使用,请参见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;
Run Code Online (Sandbox Code Playgroud)
但是,可能值得考虑在应用程序中使用最低的值,而不是使用负无穷大,因为这可能会导致更便携的解决方案。
| 归档时间: |
|
| 查看次数: |
38461 次 |
| 最近记录: |