454,445 Members | 1,329 Online Need help? Post your question and get tips & solutions from a community of 454,445 IT Pros & Developers. It's quick & easy.

# Decide if a number is negative or positive?

 P: n/a I need to make some special action if 'a' and 'b' are both positive or both negative. Is there some inbuilt function to check this? Johs Jan 3 '07 #1
19 Replies

 P: n/a Johs said: I need to make some special action if 'a' and 'b' are both positive or both negative. Is there some inbuilt function to check this? How about zero, which is neither positive or negative? With that caveat, consider this: #define SAME_SIGN(a, b) ((((a)<0)==((b)<0))&&(((a)>0)==((b)>0))) -- Richard Heathfield "Usenet is a strange place" - dmr 29/7/1999 http://www.cpax.org.uk email: rjh at the above domain, - www. Jan 3 '07 #2

 P: n/a In article , Richard Heathfield I need to make some special action if 'a' and 'b' are both positive orboth negative. Is there some inbuilt function to check this? >How about zero, which is neither positive or negative? And if either of the values may be a floating-point number, you need to consider how you want -0 (which is distinct from +0 in some floating point systems) to behave. -- Richard -- "Consideration shall be given to the need for as many as 32 characters in some alphabets" - X3.4, 1963. Jan 3 '07 #3

 P: n/a Johs wrote: I need to make some special action if 'a' and 'b' are both positive or both negative. Is there some inbuilt function to check this? Johs I am not really sure if there is an inbuilt function or not. AFAIK it would take less time to code it than to find that special function if it was available. Anyways here's the code, not tested though: /* product of two positive or two negative numbers is always positive * and equality with zero takes care of the special case 0. */ if ( (a* b) >= 0 ) { /* the numbers are either both positive or both negative */ } This will also remove the the conflict between +0 and -0, which ever type of signed 0 it is, they both must be of the same sign. Sometimes we have to live with non-sense like +0 or -0. HTH -- Regards Taran Jan 3 '07 #4

 P: n/a Taran wrote: Johs wrote: >I need to make some special action if 'a' and 'b' are both positive orboth negative. Is there some inbuilt function to check this?Johs I am not really sure if there is an inbuilt function or not. AFAIK it would take less time to code it than to find that special function if it was available. Anyways here's the code, not tested though: /* product of two positive or two negative numbers is always positive * and equality with zero takes care of the special case 0. */ if ( (a* b) >= 0 ) { /* the numbers are either both positive or both negative Or the product can't be represented as a value of the appropriate kind. This is a Very Bad Way to try and solve the problem. I don't see why if (a 0 && b 0 || a < 0 && b < 0) ... co-signed ... (fiddle with >=, <= to taste) isn't good enough. Or if (a < 0 == b < 0) ... co-signed ... -- Chris "hopefully not Pyecroft" Dollin "The path to the web becomes deeper and wider" - October Project Jan 3 '07 #5

 P: n/a Richard Tobin wrote: Richard Heathfield >I need to make some special action if 'a' and 'b' are bothpositive or both negative. Is there some inbuilt function tocheck this? >How about zero, which is neither positive or negative? And if either of the values may be a floating-point number, you need to consider how you want -0 (which is distinct from +0 in some floating point systems) to behave. I believe the standards commitee has found that there are no implementations extant where insistance on all bits zero will fail to simulate 0.0, and thus plan to allow that in the future. NULL is another matter, but usually works. Document any such usage as non-portable. -- Chuck F (cbfalconer at maineline dot net) Available for consulting/temporary embedded and systems. Jan 3 '07 #6

 P: n/a "Johs" writes: >I need to make some special action if 'a' and 'b' are both positive or bothnegative. Is there some inbuilt function to check this? No, there is no built in function to do this. The best way, in general, to answer this kind of thing in the future is to take a good reference, such as the appendix in K&R, and make some personal notes on the various headers. This will force you to actually read, rather than skim, the contents. Most everything will fit into some kind of category, but you really need to study come to mind. But in a practical sense this still leaves the question, OK, it is not standard but "Does *my* compiler have such a function?" For example, there might be something special to convert "endinadness". I don't have any particularly helpful hints on that problem. Study and practice, practice, practice AFAIK. Jan 3 '07 #7

 P: n/a "Johs" I need to make some special action if 'a' and 'b' are both positive or bothnegative. Is there some inbuilt function to check this? Johs If they are both signed integers of the same size, the easiest way to test for both positive or both negative is probably something like: (a ^ b) >= 0 I'm naturally making the assumption of standard 2's complement representation (and I haven't seen a machine that doesn't support this, but I don't know what standards apply). This assumes that the machine hardware economically fetches an integer in one instruction. If not, one needs only to test the upper byte or word of each. Jan 3 '07 #8

 P: n/a In article <45***************@yahoo.com>, CBFalconer >>I need to make some special action if 'a' and 'b' are bothpositive or both negative. Is there some inbuilt function tocheck this? >>How about zero, which is neither positive or negative? >And if either of the values may be a floating-point number, youneed to consider how you want -0 (which is distinct from +0 insome floating point systems) to behave. >I believe the standards commitee has found that there are noimplementations extant where insistance on all bits zero will failto simulate 0.0, and thus plan to allow that in the future. I don't see the relevance of this to the question. I was pointing out that the OP must decide whether he wants to consider -0 and +0 as having the same sign or not; this has nothing to do with the representation. -- Richard -- "Consideration shall be given to the need for as many as 32 characters in some alphabets" - X3.4, 1963. Jan 3 '07 #9

 P: n/a Johs wrote: > I need to make some special action if 'a' and 'b' are both positive or both negative. Is there some inbuilt function to check this? If by "positive" you really mean "non-negative" (ie: including zero), then this (*untested*) should work: #define SAME_SIGN(a,b) ( ((a)<0) == ((b)<0) ) -- +-------------------------+--------------------+-----------------------+ | Kenneth J. Brody | www.hvcomputer.com | #include | | kenbrody/at\spamcop.net | www.fptech.com | Jan 3 '07 #10

 P: n/a CBFalconer Richard Heathfield >>I need to make some special action if 'a' and 'b' are bothpositive or both negative. Is there some inbuilt function tocheck this? >>How about zero, which is neither positive or negative? And if either of the values may be a floating-point number, youneed to consider how you want -0 (which is distinct from +0 insome floating point systems) to behave. I believe the standards commitee has found that there are no implementations extant where insistance on all bits zero will fail to simulate 0.0, and thus plan to allow that in the future. NULL is another matter, but usually works. Document any such usage as non-portable. Apart from not being, as far as I can see, relevant to the point, I haven't heard anything about all-bits-zero being universally a representation for 0.0. It wasn't until relatively recently (post-C99) that the committee decided that all-bits-zero is always a representation of 0 for integer types; could that be what you're thinking of? -- Keith Thompson (The_Other_Keith) ks***@mib.org San Diego Supercomputer Center <* We must do something. This is something. Therefore, we must do this. Jan 3 '07 #11

 P: n/a "David T. Ashley" >I need to make some special action if 'a' and 'b' are both positive or bothnegative. Is there some inbuilt function to check this?Johs If they are both signed integers of the same size, the easiest way to test for both positive or both negative is probably something like: (a ^ b) >= 0 I'm naturally making the assumption of standard 2's complement representation (and I haven't seen a machine that doesn't support this, but I don't know what standards apply). This assumes that the machine hardware economically fetches an integer in one instruction. If not, one needs only to test the upper byte or word of each. This is an obscure way to go about it. The standard doesn't require a 2's complement representation for signed integers, though it's almost universal these days. The fact that you talk about testing only the upper byte or word of each operand tells me you're thinking in terms of micro-optimization, which is usually a bad idea *unless* you've confirmed that the code in question is a significant performance bottleneck. (Personally, I wouldn't try to use bitwise operations on signed integers; I've never bothered to learn how they behave. If I ever need to know, I'll look it up.) Also, the OP didn't say he's working with integers. Just write the code as clearly as possible, such as: (a >= 0 && b >= 0) || (a < 0 && b < 0) or even (a >= 0) == (b >= 0) -- Keith Thompson (The_Other_Keith) ks***@mib.org San Diego Supercomputer Center <* We must do something. This is something. Therefore, we must do this. Jan 3 '07 #12

 P: n/a Keith Thompson wrote: "David T. Ashley" "Johs" >I need to make some special action if 'a' and 'b' are both positive or bothnegative. Is there some inbuilt function to check this?Johs If they are both signed integers of the same size, the easiest way to testfor both positive or both negative is probably something like:(a ^ b) >= 0I'm naturally making the assumption of standard 2's complementrepresentation (and I haven't seen a machine that doesn't support this, butI don't know what standards apply).This assumes that the machine hardware economically fetches an integer inone instruction. If not, one needs only to test the upper byte or word ofeach. This is an obscure way to go about it. The standard doesn't require a 2's complement representation for signed integers, though it's almost universal these days. The fact that you talk about testing only the upper byte or word of each operand tells me you're thinking in terms of micro-optimization, which is usually a bad idea *unless* you've confirmed that the code in question is a significant performance bottleneck. (Personally, I wouldn't try to use bitwise operations on signed integers; I've never bothered to learn how they behave. If I ever need to know, I'll look it up.) Also, the OP didn't say he's working with integers. Just write the code as clearly as possible, such as: (a >= 0 && b >= 0) || (a < 0 && b < 0) or even (a >= 0) == (b >= 0) or even !(a < 0) ^ !(b < 0) -- Joe Wright "Everything should be made as simple as possible, but not simpler." --- Albert Einstein --- Jan 3 '07 #13

 P: n/a Joe Wright wrote: > Keith Thompson wrote: Just write the code as clearly as possible, such as: (a >= 0 && b >= 0) || (a < 0 && b < 0) or even (a >= 0) == (b >= 0) or even !(a < 0) ^ !(b < 0) Not even. He said "as clearly as possible" for a reason. /* BEGIN new.c */ #include int main(void) { int a, b; puts("/* BEGIN new.c output */\n"); for (a = -1; a != 2; ++a) { for (b = -1; b != 2; ++b) { printf("a is %d\nb is %d\n", a, b); printf("(a >= 0 && b >= 0) || (a < 0 && b < 0) is %d\n", (a >= 0 && b >= 0) || (a < 0 && b < 0)); printf("(a >= 0) == (b >= 0) is %d\n", (a >= 0) == (b >= 0)); printf("!(a < 0) ^ !(b < 0) is %d\n", !(a < 0) ^ !(b < 0)); putchar('\n'); } } puts("/* END new.c output */"); return 0; } /* END new.c */ -- pete Jan 3 '07 #14

 P: n/a Joe Wright wrote: Keith Thompson wrote: Just write the code as clearly as possible, such as: (a >= 0 && b >= 0) || (a < 0 && b < 0) or even (a >= 0) == (b >= 0) or even !(a < 0) ^ !(b < 0) Do you mean !( !(a < 0) ^ !(b < 0) ) ? Jan 4 '07 #15

 P: n/a Spiros Bousbouras wrote: > Joe Wright wrote: Keith Thompson wrote: Just write the code as clearly as possible, such as: > (a >= 0 && b >= 0) || (a < 0 && b < 0) > or even > (a >= 0) == (b >= 0) > or even !(a < 0) ^ !(b < 0) Do you mean !( !(a < 0) ^ !(b < 0) ) ? !(a < 0) ^ (b < 0) would work, but (a >= 0) == (b >= 0) is really a better way to write it. -- pete Jan 4 '07 #16

 P: n/a "Keith Thompson" "Johs" >>I need to make some special action if 'a' and 'b' are both positive orbothnegative. Is there some inbuilt function to check this?Johs If they are both signed integers of the same size, the easiest way totestfor both positive or both negative is probably something like:(a ^ b) >= 0I'm naturally making the assumption of standard 2's complementrepresentation (and I haven't seen a machine that doesn't support this,butI don't know what standards apply).This assumes that the machine hardware economically fetches an integer inone instruction. If not, one needs only to test the upper byte or wordofeach. This is an obscure way to go about it. The standard doesn't require a 2's complement representation for signed integers, though it's almost universal these days. The fact that you talk about testing only the upper byte or word of each operand tells me you're thinking in terms of micro-optimization, which is usually a bad idea *unless* you've confirmed that the code in question is a significant performance bottleneck. (Personally, I wouldn't try to use bitwise operations on signed integers; I've never bothered to learn how they behave. If I ever need to know, I'll look it up.) Also, the OP didn't say he's working with integers. Just write the code as clearly as possible, such as: (a >= 0 && b >= 0) || (a < 0 && b < 0) or even (a >= 0) == (b >= 0) I agree with everything you wrote about obscurity. I'll just make the observation that compilers are notoriously bad at certain types of comparisons. A plain vanilla comparison (a < b) is generally done well. However, with bitfields in particular, I've seen some really bad code. For example, on the compiler I'm using presently (with bitfields of size 1), the comparison: (x.bf1 == x.bf2) results in a huge bulk of code as the bitfields are converted into integers and then compared. I've actually found it is cheaper to write: ((x.bf1 && x.bf2) || (!x.bf1 && !x.bf2)) I do agree with you in principle about micro-optimization. You are right. Jan 4 '07 #17

 P: n/a Keith Thompson wrote: > .... snip ... > Apart from not being, as far as I can see, relevant to the point, I haven't heard anything about all-bits-zero being universally a representation for 0.0. It wasn't until relatively recently (post-C99) that the committee decided that all-bits-zero is always a representation of 0 for integer types; could that be what you're thinking of? Probably. -- Chuck F (cbfalconer at maineline dot net) Available for consulting/temporary embedded and systems. Jan 4 '07 #18

 P: n/a >And if either of the values may be a floating-point number, you >need to consider how you want -0 (which is distinct from +0 insome floating point systems) to behave. I believe the standards commitee has found that there are noimplementations extant where insistance on all bits zero will failto simulate 0.0, and thus plan to allow that in the future. NULLis another matter, but usually works. Document any such usage asnon-portable. On the other hand, many implementations (including all the IEEE floating-point ones) have at least two distinct representations of zero, at least one of which isn't all-bits-zero (although the other one probably is all-bits-zero). Jan 7 '07 #19

 P: n/a Taran wrote: Johs wrote: I need to make some special action if 'a' and 'b' are both positive or both negative. Is there some inbuilt function to check this? Anyways here's the code, not tested though: if ( (a* b) >= 0 ) Will cause trouble if a*b overflows. Jan 7 '07 #20

### This discussion thread is closed

Replies have been disabled for this discussion. 