Interesting to see some of my code back

Some Arduino floating points points:

- the Arduino has only 7 digits of precision, the compiler will take care of rounding

- the compiler accepts E notation in float constants, which removes unneeded pow(10, n) from your code

- a fifth order polynome with integer powers can speed up by a big factor by decomposing it using only 5 multiplies and 5 additions.

void setup()

{

Serial.begin(9600);

Serial.println("start...");

long val = 420;

f = 1.354026784*pow(10,-8)*pow(val,5) //pow(10,-8) raises 1.354026784 to the 10-8

- 2.559722383*pow(10,-5)*pow(val,4)

+ 0.0192917182*pow(val,3)

- 7.24448384*pow(val,2)

+ 1356.112407*val

- 101259.7822;

Serial.println(f,5);

Serial.println(float2s(f, 5));

// removing pow() completely

f = 1.354026784E-8* val*val*val*val*val - 2.559722383E-5* val*val*val*val + 1.92917182E-2 * val*val*val - 7.24448384 * val*val + 1356.112407*val - 101259.7822;

Serial.println(f,5);

Serial.println(float2s(f,5));

// minimize math

f = (((( 1.354026784E-8 * val - 2.559722383E-5 ) * val + 1.92917182E-2 ) * val - 7.24448384 ) * val + 1356.112407) * val - 101259.7822;

Serial.println(f,5);

Serial.println(float2s(f, 5));

}

void loop(){}

116.9063

output

start...

116.90625

1.16906 E+2

116.84375

1.16843 E+2

116.79688

1.16796 E+2

Note that method 2 and 3 which uses less operations already differ in the 4th digit, so calculating this with more than 5 digits is speculative at best.

This is caused by the fact that all the partial sums ( a.pow(b,n) ) are in the same order of magnitude 10^5..10^6 and their sum is 2 to 3 orders of magnitude lower.

(you're losing significant bits here)

BTW according to Excel the "right" value == 116.935898400974 so simplifying the math does make it worse this time.

Excel snippet (,'s are due to localization)

coefficient 420^n partial result

1,354026784000000E-08 1,306912320000000E+13 1,769594285619580E+05

-2,559722383000000E-05 3,111696000000000E+10 -7,965077900291570E+05

1,929171820000000E-02 7,408800000000000E+07 1,429284818001600E+06

-7,244483840000000E+00 1,764000000000000E+05 -1,277926949376000E+06

1,356112407000000E+03 4,200000000000000E+02 5,695672109400000E+05

-1,012597822000000E+05 1,000000000000000E+00 -1,012597822000000E+05

sum = 1,169358984009740E+02