Как лучше всего проверять бесконечность в модуле Perl?

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

13
задан Eric Strom 4 October 2010 в 16:00
поделиться