В одном из моих модулей я имею дело с концепцией бесконечности. До настоящего времени я использовал 9**9**9
в качестве положительной бесконечности, и это, кажется, работает хорошо, быстро и, похоже, то, что внутренние компоненты Perl используют как бесконечность.
Однако все становится немного рискованно, если пользователь моего модуля решит использовать один из модулей с большим числом (например, use bigint;
), а затем он использует inf
или Math::BigInt->binf()
для представления бесконечности.
В некоторых местах это, кажется, работает нормально, но в других, сравнения, которые должны быть истинными или ложными, приводят к неправильному пути, приводящему к трудным поискам ошибок.
Я бы хотел поддержать различные другие понятия бесконечности чем-то, что будет работать как с обычными числами perl, так и с числами произвольной точности.
Но у меня также есть проблемы с производительностью, поскольку некоторые из моих сравнений с бесконечностью происходят в тесных внутренних циклах. Очевидно, что inf
из Math::BigInt
будет медленнее, чем 9**9**9
(из-за вызова связанных или перегруженных методов при каждом доступе). Кто-нибудь имел дело с этой проблемой в прошлом? Если да, то каково было ваше решение?
Я думал об использовании моей собственной константы для бесконечности, определил что-то вроде этого:
use constant INF => if_any_bignum_modules_loaded()
? Math::BigInt->binf
: 9**9**9;
А затем добавьте в мой модуль предупреждение о том, что любые модули bignum должны быть загружены первыми. Это звучит разумно? Есть ли надежная реализация if_any_bignum...
или я должен развернуть свою собственную?