为什么 MSVC std::exponential_distribution::max() 返回 inf?

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

为什么以下代码使用最新的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

  • 在答案中指出,将类型更改为 double 只会减少出现问题的机会;
  • 在作者的问题下的评论中指出,切换到双重解决了该问题。

我是否应该得到这样的信息“既然现在它变得越来越罕见,问题的作者会很高兴为他的代码获得定时炸弹,这将导致

inf
意外且相当罕见=难以找到和调试”?

如果是这样,如果我得到

inf
结果很可能会导致溢出、异常、错误计算并最终导致未定义的行为,那么这个分布有什么用?

我应该在每一代之后检查

std::isinf()
吗?

c++ random std
1个回答
0
投票
Microsoft C++ 标准库中的

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()

© www.soinside.com 2019 - 2024. All rights reserved.