为什么以下代码使用最新的MSVC++打印
inf
?
#include <iostream>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::exponential_distribution<double> d(1);
std::cout << "max = " << d.max() << std::endl << std::endl;
}
Clang 没有这样的问题(不知道如何获取 gcc 的输出 – 请参阅相同的 demo)。
我在 std::exponential_distribution:
中看到如果 RealType 为浮点型,某些实现有时可能会返回无穷大。这是 LWG 第 2524 期。
但默认类型是
double
,如果我明确将 double
或 long double
用作 std::exponential_distribution
,也会出现同样的问题。
这只是
max()
方法中的错误吗?还是我真的应该关心 MSVC 是否可以生成 inf
,即使对于双类型? (由于该方法的随机性,为此编写测试几乎是不可能的)。
我在 C++exponential_distribution 中看到一些可疑的东西,偶尔会返回 inf,其中预期为 0:
我是否应该得到这样的信息“既然现在它变得越来越罕见,问题的作者会很高兴为他的代码获得定时炸弹,这将导致
inf
意外且相当罕见=难以找到和调试”?
如果是这样,如果我得到
inf
结果很可能会导致溢出、异常、错误计算并最终导致未定义的行为,那么这个分布有什么用?
我应该在每一代之后检查
std::isinf()
吗?
std::exponential_distribution<RealType>::max
已实现返回numeric_limits<result_type>::infinity()
result_type(max)() const noexcept /* strengthened */ { // get largest possible result
return numeric_limits<result_type>::infinity();
}
如果需要的话,应该使用
std::isinf()
。