Problems? Is your data what you think it is? PerlMonks

### Re: Seeing if two numbers have the same sign

by f00li5h (Chaplain)
 on Jan 10, 2008 at 14:56 UTC ( #661626=note: print w/replies, xml ) Need Help??

in reply to Seeing if two numbers have the same sign

```sub same_sign{
my(\$left, \$right) =@_;
(0 <=> \$left) == (0<=> \$right);

}

@_=qw; ask f00li5h to appear and remain for a moment of pretend better than a lifetime;;s;;@_[map hex,split'',B204316D8C2A4516DE];;y/05/os/&print;

Replies are listed 'Best First'.
Re^2: Seeing if two numbers have the same sign
by WoodyWeaver (Scribe) on Jan 10, 2008 at 15:15 UTC
What is the goal here?

Using <=> is clever, I think. And by that I mean that it invokes a less common set of symbols to come to a result in a surprising and elegant way.

I'm not sure that is good, though. Assuming that if either variable is zero you should return 0, my first thought was

```if (\$left > 0) {
if (\$right > 0) { # both pos
return 1
}
} elsif (\$left < 0) {
if (\$right < 0) { # both neg
return 1
}
}
return 0;
That is, anchor one, see if the other is the same, and if so return 1; otherwise, fall through and return 0.

I think this is bad because its a whole bunch of lines. On the other hand, I think its good because its dead obvious, and probably pretty fast (fewer compares and jumps than even the double '<=>' version).

ymmv. "What is good?", asked jesting Pilate, not waiting for an answer.

--woody

Using the shuttles I'm basiclaly asking "Do these 2 numbers compare to zero the same way"

Personally i'm a fan of the \$left * \$right > 0 solution, it has a nice mathy feel. although may have issues for massive numbers etc (Corion++ on that count)

@_=qw; ask f00li5h to appear and remain for a moment of pretend better than a lifetime;;s;;@_[map hex,split'',B204316D8C2A4516DE];;y/05/os/&print;

Re^2: Seeing if two numbers have the same sign
by shmem (Chancellor) on Jan 10, 2008 at 16:52 UTC
Nice, f00li5h++
```sub same_sign {
(0 <=> \$_[0]) == (0 <=> \$_[1])
||
(! \$_[0] || ! \$_[1]);
}

to check for either operand being somewhat false ;-)

--shmem

```_(\$_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
/\_¯/(q    /
----------------------------  \__(m.====·.(_("always off the crowd"))."·
");sub _{s./.(\$e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;\$e.e && print}```

Create A New User
Node Status?
node history
Node Type: note [id://661626]
help
Chatterbox?
 [erix]: I recognise the makings of a fine argument [LanX]: lanx wonders ... how likely is it to talk >95% BS without intention? [erix]: "gigantic amounts of data" is also not SQLite (imho) talexb wonders why sqlite2 was deprecated in favour of sqlite3. [erix]: looks like a fork, rather, no? LanX /me /me

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (12)
As of 2017-07-28 15:33 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
I came, I saw, I ...

Results (431 votes). Check out past polls.