Go Down

### Topic: Want to find x^y and maintain sign, ie squaring negative numbers (Read 1 time)previous topic - next topic

#### bjosephs

##### Aug 23, 2013, 04:04 am
Hi all,

I have a program that measures angles - positive and negative.  I'd like to raise them to a power but maintain their sign when I use them later.  To be clear, I need .5 degrees to be squared to .25... 2 becomes 4... but I also want -.5 to become -.25... -2 returns -4... etc.  We all know that a negative times a negative is a positive and naturally the built in "pow" function always returns positive when given a negative base value.  I have been trying all night to write a simple function to handle this for me:  By taking 2 floating inputs (a base and an exponent), checking if the base is < 0 and setting a int variable called "sign" to -1.  Later in the function (after the power has been found) the result of pow gets multiplied by sign to return it to the correct polarity.  I've tried a dozen different permutations of the code below but the result is always the same... positive result return correctly, anything that results in a negative result returns 0.00.  This includes manually multiplying "result" by -1 or removing the "if" code and initializing sign to -1.  I need a second opinion:

Code: [Select]
`void setup() {Serial.begin(115200); //Initialize Serial Port}void loop() {  double newval = scale(2.0,2.0);    Serial.println(newval);  delay(200);  }double scale(float input, float factor)  {    int sign = 1.0;  if (input < 0.0){  sign = -1.0;  }  double result = pow(input, factor);   result = result * sign;  return result;}`

#### el_supremo

#1
##### Aug 23, 2013, 04:29 am
Code: [Select]
`  double newval = scale(-2.0,2.0);`
Prints -4.00 for me.

Pete
Don't send me technical questions via Private Message.

#### PaulS

#2
##### Aug 23, 2013, 04:29 am
Code: [Select]
`  Serial.println(newval);`
So, you know how to print stuff. Like input, sign, and result. But, you don't. Why not?

#### robtillaart

#3
##### Aug 23, 2013, 10:45 am

at least this line is ambiguous
Code: [Select]
`int sign = 1.0;`

Try this variation
Code: [Select]
`void setup() {  Serial.begin(115200);  for (int i = -50; i <= 50; i++)  {    double newval = scale(i * 0.12345, 2.0);    Serial.println(newval, 4);  }  Serial.println("\ndone...");}void loop() {}double scale(float input, float factor){  double value = pow(input, factor);  if (input < 0.0) value = -value;  // only adjust calculated factor when input is negative.   return value;}`
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Go Up