Go Down

Topic: Want to find x^y and maintain sign, ie squaring negative numbers (Read 428 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