Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re^3: Comparing a value to a list of numbers

by LanX (Cardinal)
on Jan 31, 2021 at 20:06 UTC ( #11127720=note: print w/replies, xml ) Need Help??


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

  • Comment on Re^3: Comparing a value to a list of numbers

Replies are listed 'Best First'.
Re^4: Comparing a value to a list of numbers
by haukex (Bishop) 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.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://11127720]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (2)
As of 2021-06-13 03:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    What does the "s" stand for in "perls"? (Whence perls)












    Results (54 votes). Check out past polls.

    Notices?