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 Need Help??

> 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.

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?