http://www.perlmonks.org?node_id=11127720


in reply to Re^2: Comparing a value to a list of numbers
in thread Comparing a value to a list of numbers

> Set::IntSpan uses a binary search.

Interesting, so why is it restricted to Integers?

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery

Replies are listed 'Best First'.
Re^4: Comparing a value to a list of numbers
by haukex (Archbishop) on Feb 01, 2021 at 15:48 UTC
    Interesting, so why is it restricted to Integers?

    Likely because that's simply its purpose, plus I imagine certain set operations would be problematic due to floating-point inaccuracies.

      > plus I imagine certain set operations would be problematic due to floating-point inaccuracies.

      I doubt this, rounding errors happen only after arithmetic operations

      as long as two floats are different, comparisons will show a strict order:

      DB<95> $one = 1-1e-16 DB<96> printf '%.17f', $one 0.99999999999999989 DB<97> p 1 > $one 1 DB<98> $one = 1-1e-16 DB<99> p $one 1 DB<100>

      FWIW 0.1e-1 and 1e-2 are the same float in my books.

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery

        > plus I imagine certain set operations would be problematic due to floating-point inaccuracies.
        I doubt this, rounding errors happen only after arithmetic operations

        I was thinking something like:

        $ perl -MSet::IntSpan -le 'print Set::IntSpan->new("1-10")->complement +->run_list' (-0,11-)

        What's the equivalent with floating-point? Does the lower range end at 0.9, 0.99, 0.999, 0.9999, ...? I know there's probably a mathematically valid answer, but I wonder how it would be represented as a floating-point number.

        Another one:

        use Set::IntSpan; my $set = Set::IntSpan->new('3-12,25-30,42'); for ( my $el=$set->first; defined $el; $el=$set->next ) { print "$el\n"; }

        Workarounds would be possible, like telling the iterator what size steps it should take.

        I'm not the module's author, so I can't tell you any more "why" and "why not" :-) It's probably possible to write a similar module that handles floats, but Set::IntSpan isn't it ;-)

        Update: And, of course it's possible to work with decimals if you multiply them by the appropriate factors, like how I work with milliseconds instead of seconds in Determining Gaps and Overlap in Timestamped Data.