Negative integers

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • johnewing

    Negative integers

    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

    #2
    Re: Negative integers

    johnewing wrote:
    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>

    Comment

    • Dan Stromberg

      #3
      Re: Negative integers

      On Wed, 20 Aug 2008 14:38:11 -0700, johnewing wrote:
      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 straightforward ly, 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.pytho n 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'

      Comment

      • Christian Heimes

        #4
        Re: Negative integers

        johnewing wrote:
        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.
        >>from math import copysign
        >>copysign(1. 0, 23)
        1.0
        >>copysign(1. 0, -42)
        -1.0
        >>copysign(1. 0, -0.0)
        -1.0
        >>copysign(1. 0, +0.0)
        1.0
        >>-0.0 == +0.0
        True

        Christian

        Comment

        • Ethan Furman

          #5
          Re: Negative integers

          nntpman68 wrote:
          johnewing wrote:
          >
          >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~

          Comment

          • John Machin

            #6
            Re: Negative integers

            On Aug 21, 7:46 am, Fredrik Lundh <fred...@python ware.comwrote:
            johnewing wrote:
            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)
            >
            That supposes that the OP understands "sign" to mean "the sign bit".
            Another possibility is the sgn/sign/signum function (http://
            en.wikipedia.or g/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".
            >>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.
            >>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

            Comment

            • Derek Martin

              #7
              Re: Negative integers

              On Wed, Aug 20, 2008 at 02:38:11PM -0700, johnewing wrote:
              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:
              >>sign(-0, 1)
              True
              >>sign(0, 1)
              True
              >>sign(0, -1)
              False

              Close, but no cigar.

              --
              Derek D. Martin

              GPG Key ID: 0x81CFE75D


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

              iD8DBQFIrKbzdjd lQoHP510RAuRFAK CayUZPcbsyvGfe7 EwHLgZ+EXtfcQCg ozYK
              7fhrw8i5SqHFiPk CU0OI/8Y=
              =r1dA
              -----END PGP SIGNATURE-----

              Comment

              • johnewing

                #8
                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

                Comment

                • eliben

                  #9
                  Re: Negative integers

                  On Aug 21, 1:30 am, Ethan Furman <et...@stonelea f.uswrote:
                  nntpman68 wrote:
                  johnewing wrote:
                  >
                  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.
                  >
                  Except that zero is neither negative nor positive, mathematically, so
                  any answer here is correct.

                  Eli



                  Comment

                  • Mikael Olofsson

                    #10
                    Re: Negative integers

                    Derek Martin wrote:
                    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.
                    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:



                    /MiO

                    Comment

                    • Uwe Schmitt

                      #11
                      Re: Negative integers

                      On 20 Aug., 23:38, johnewing <john....@gmail .comwrote:
                      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

                      Comment

                      Working...