Почему 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
функции-члены описывают, что может произойти, и являются точными: они не подразумевают какой-либо механизм для того, чтобы это произошло.