Go Down

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

bjosephs

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

Code: [Select]
  double newval = scale(-2.0,2.0);
Prints -4.00 for me.

Pete

PaulS

Code: [Select]
  Serial.println(newval);
So, you know how to print stuff. Like input, sign, and result. But, you don't. Why not?

robtillaart


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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy