В одном из моих модулей я должен разобраться с концепцией бесконечности. На сегодняшний день я использовал 9 ** 9 ** 9
как положительную бесконечность, и это, кажется, работает хорошо, быстро и, похоже, именно то, что внутреннее устройство Perl использует как бесконечность.
Однако все становится немного рискованно, если пользователь моего модуля решает использовать один из модулей с большими числами (например, использовать 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 ...
там, или я должен использовать свой собственный?