Connecting Tech Pros Worldwide Forums | Help | Site Map

Negative integers

johnewing
Guest
 
Posts: n/a
#1: Aug 20 '08
I am trying to figure out how to test if two numbers are of the same
sign (both positive or both negative). I have tried

abs(x) / x == abs(y) / y

but that fails when one of the numbers is 0. I'm sure that there is
an easy way to do this. Any suggestions?

Thanks

Fredrik Lundh
Guest
 
Posts: n/a
#2: Aug 20 '08

re: Negative integers


johnewing wrote:
Quote:
I am trying to figure out how to test if two numbers are of the same
sign (both positive or both negative). I have tried
>
abs(x) / x == abs(y) / y
>
but that fails when one of the numbers is 0. I'm sure that there is
an easy way to do this. Any suggestions?
(a < 0) == (b < 0)

</F>

Dan Stromberg
Guest
 
Posts: n/a
#3: Aug 20 '08

re: Negative integers


On Wed, 20 Aug 2008 14:38:11 -0700, johnewing wrote:
Quote:
I am trying to figure out how to test if two numbers are of the same
sign (both positive or both negative). I have tried
>
abs(x) / x == abs(y) / y
>
but that fails when one of the numbers is 0. I'm sure that there is an
easy way to do this. Any suggestions?
>
Thanks
Don't resort to inline tricks too soon. Write your program in a very
straightforward way (perhaps paying attention to algorithm choice or a
functional style), and only start optimizing if it's too slow. And if it
is too slow, you probably should look at pyrex or similar before
resorting to unusual python code.

Part of writing straightforwardly, means having a function or object that
encapsulates each decision the program makes - so that if that decision
later needs to be changed, it can be changed in one place.

I've been frequenting comp.unix.shell lately, and the group is plagued
with weird little tricks - EG, using : as an alias for true, 1 as an
alias for print, etc. I'd rather not see comp.lang.python turned into
that sort of group. (That said, I program in bash frequently - by choice)

$ cat /tmp/sign
#!/usr/bin/env python

def sign(x):
return cmp(x,0)

print sign(-5)
print sign(0)
print sign(33)

if sign(-5) == sign(-2):
print 'Same sign'

Christian Heimes
Guest
 
Posts: n/a
#4: Aug 20 '08

re: Negative integers


johnewing wrote:
Quote:
but that fails when one of the numbers is 0. I'm sure that there is
an easy way to do this. Any suggestions?
For the not-so-distant future:

Python 2.6 and 3.0 have a new function "copysign" in the math module. I
added it during the revamp of the math module. copysign(x, y) returns x
as float with the sign of y. It works also works for ints, longs and
floats as y. copysign() is the most reliable and fastest way to
distinguish -0.0 from +0.0.
Quote:
Quote:
Quote:
>>from math import copysign
>>copysign(1.0, 23)
1.0
Quote:
Quote:
Quote:
>>copysign(1.0, -42)
-1.0
Quote:
Quote:
Quote:
>>copysign(1.0, -0.0)
-1.0
Quote:
Quote:
Quote:
>>copysign(1.0, +0.0)
1.0
Quote:
Quote:
Quote:
>>-0.0 == +0.0
True

Christian

Ethan Furman
Guest
 
Posts: n/a
#5: Aug 20 '08

re: Negative integers


nntpman68 wrote:
Quote:
johnewing wrote:
>
Quote:
>I am trying to figure out how to test if two numbers are of the same
>sign (both positive or both negative). I have tried
>>
>abs(x) / x == abs(y) / y
>>
>but that fails when one of the numbers is 0. I'm sure that there is
>an easy way to do this. Any suggestions?
>>
>Thanks
>
Hm,
>
>
It seems my previous reply got lost.
>
>
if a*b 0:
print "same sign"
else
print "different sign"
>
>
Looks good at first, but -5 * 0 == +7 * 0.

~Ethan~
John Machin
Guest
 
Posts: n/a
#6: Aug 20 '08

re: Negative integers


On Aug 21, 7:46 am, Fredrik Lundh <fred...@pythonware.comwrote:
Quote:
johnewing wrote:
Quote:
I am trying to figure out how to test if two numbers are of the same
sign (both positive or both negative). I have tried
>
Quote:
abs(x) / x == abs(y) / y
>
Quote:
but that fails when one of the numbers is 0. I'm sure that there is
an easy way to do this. Any suggestions?
>
(a < 0) == (b < 0)
>
That supposes that the OP understands "sign" to mean "the sign bit".
Another possibility is the sgn/sign/signum function (http://
en.wikipedia.org/wiki/Sign_function). In that case the answer would be
cmp(a, 0) == cmp(b, 0) -- with one big caveat:

Although cmp appears to return only -1, 0, or +1, it is documented to
return "negative", "zero" or "positive".
Quote:
Quote:
Quote:
>>help(cmp)
Help on built-in function cmp in module __builtin__:

cmp(...)
cmp(x, y) -integer

Return negative if x<y, zero if x==y, positive if x>y.
Quote:
Quote:
Quote:
>>cmp(10, 90)
-1

Perhaps safer and better documentation to define your own sign and
samesign:

sign = lambda x: x < 0
or
sign = lambda x: -1 if x < 0 else 0 if x == 0 else 1
samesign = lambda a, b: sign(a) == sign(b)

Cheers,
John
Derek Martin
Guest
 
Posts: n/a
#7: Aug 21 '08

re: Negative integers


On Wed, Aug 20, 2008 at 02:38:11PM -0700, johnewing wrote:
Quote:
I am trying to figure out how to test if two numbers are of the same
sign (both positive or both negative). I have tried
>
abs(x) / x == abs(y) / y
Zero is a problem, no matter how you slice it. Zero can be considered
positive or negative (mathematically, 0 = -0).

If you want zero to be treated always as positive, you can write this:

def same_sign(a, b):
return (abs(a) == a) == (abs(b) == b)

If you want to respect zero's duplicitous nature, you have to write it
like this:

def same_sign(a, b):
if a == 0 or b == 0:
return True
return (abs(a) == a) == (abs(b) == b)

The first version *almost* works for the duplicitous zero:
Quote:
Quote:
Quote:
>>sign(-0, 1)
True
Quote:
Quote:
Quote:
>>sign(0, 1)
True
Quote:
Quote:
Quote:
>>sign(0, -1)
False

Close, but no cigar.

--
Derek D. Martin
http://www.pizzashack.org/
GPG Key ID: 0x81CFE75D


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQFIrKbzdjdlQoHP510RAuRFAKCayUZPcbsyvGfe7EwHLg Z+EXtfcQCgozYK
7fhrw8i5SqHFiPkCU0OI/8Y=
=r1dA
-----END PGP SIGNATURE-----

johnewing
Guest
 
Posts: n/a
#8: Aug 21 '08

re: Negative integers


I managed to change my dataflow so that an earlier test rules out the
possibility of a zero there. Still, thank you for the fast answers,
this is my first time using the forum. Hopefully I will be able to be
on the question answering end before too long.

thanks again,
john
eliben
Guest
 
Posts: n/a
#9: Aug 21 '08

re: Negative integers


On Aug 21, 1:30*am, Ethan Furman <et...@stoneleaf.uswrote:
Quote:
nntpman68 wrote:
Quote:
johnewing wrote:
>
Quote:
Quote:
I am trying to figure out how to test if two numbers are of the same
sign (both positive or both negative). *I have tried
>
Quote:
Quote:
abs(x) / x == abs(y) / y
>
Quote:
Quote:
but that fails when one of the numbers is 0. *I'm sure that there is
an easy way to do this. *Any suggestions?
>
Quote:
Quote:
Thanks
>
*Hm,
*>
*>
*It seems my previous reply got lost.
*>
*>
*if a*b 0:
** * print "same sign"
*else
** * print "different sign"
*>
*>
>
Looks good at first, but -5 * 0 == +7 * 0.
>
Except that zero is neither negative nor positive, mathematically, so
any answer here is correct.

Eli

http://mathforum.org/library/drmath/view/58735.html
http://en.wikipedia.org/wiki/Negativ...gative_numbers
Mikael Olofsson
Guest
 
Posts: n/a
#10: Aug 21 '08

re: Negative integers


Derek Martin wrote:
Quote:
Zero is a problem, no matter how you slice it.
I definitely agree with that. Depends on the the real problem that is
behind the OP:s question.
Quote:
Zero can be considered
positive or negative (mathematically, 0 = -0).
I've read quite a few articles written by mathematicians and
mathematically oriented engineers, and my impression is that most of
them, and therefore me included, use those words with the following meaning:

Positive: >0
Negative: <0

When zero is to be included, the following terms are used:

Non-negative: >=0
Non-positive: <=0

Using this convention, zero is neither positive nor negative. Wikipedia
seems to agree with that:

http://en.wikipedia.org/wiki/Positive_number

/MiO
Uwe Schmitt
Guest
 
Posts: n/a
#11: Aug 21 '08

re: Negative integers


On 20 Aug., 23:38, johnewing <john....@gmail.comwrote:
Quote:
I am trying to figure out how to test if two numbers are of the same
sign (both positive or both negative). *I have tried
>
abs(x) / x == abs(y) / y
>
but that fails when one of the numbers is 0. *I'm sure that there is
an easy way to do this. *Any suggestions?
>
Thanks
Multiply with x and y and you get
abs(x) * y == abs(y) * x
which avoids zero division.
but testing x*y 0 is easier.

Greetings, Uwe
Closed Thread