Почему std::poisson_distribution зависает при передаче очень большого среднего значения?

Например, следующий код зависает при использовании моей установки с последней версией библиотек g++ и GNU:

      #include <random>
#include <cstdio>

std::default_random_engine rng;

int main(){
    std::poisson_distribution<long> mine(34387423874230847234.0);
    std::printf("%ld\n", mine(rng));
}

Попробуйте онлайн

Описание функций min и max здесь , по-видимому, предполагает, что он будет ограничивать вывод до максимально возможного значения параметра типа, в этом случае long. Но ясно, что этого не происходит. Это ожидаемое поведение?

Изменить: когда я связываюсь с LLVM libc++, распределение Пуассона всегда возвращается LLONG_MAX, что больше, чем я ожидал. Является ли это ошибкой GNU libstdС++?

1 ответ

Мы только что обсудили , что libstdc++ нормализует часть распределения вероятностей, которая соответствует выходному типу (чтобы относительные вероятности были правильными), тогда как libc++ ограничивает ее (чтобы среднее значение было максимально правильным). Первый подход значительно увеличил ожидаемое время выполнения в случае, когда параметр бесполезно велик, но я бы не стал называть это ошибкой.

The minа также maxфункции-члены описывают, что может произойти, и являются точными: они не подразумевают какой-либо механизм для того, чтобы это произошло.

Другие вопросы по тегам