В одном из моих модулей мне приходится иметь дело с концепцией бесконечности. На сегодняшний день я использовал 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...
, или мне стоит использовать свою?
[perl] infinity
, прежде чем опубликовать этот вопрос. - person Eric Strom   schedule 04.10.2010