Hallo zusammen,
mag mir bitte jemand weiterhelfen, wie ich die Rundungsfehler und overflow Probleme beheben kann?
Ich danke Euch vielmals!
Max
Variante 1 mit simpler Addition (Rundungsfehler ab Nr.36 & ovf.)
/* Fibonacci Rechner mit Fehlererkennung bis zur 100ten Fib-Zahl.
* var.1
*/
//Ein/Ausgaenge
const int error = 12;
//Konstanten
const int TON = 25; //Pausenzeit
//Variablen
unsigned int fpos = 0;
unsigned int fail = 0;
double fib = 0;
double x_a = 0;
double x_b = 1;
double f_check = 0;
//Arrays
double check[50]={1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,
10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,
5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,
433494437,701408733,1134903170,1836311903,2971215073,4807526976,7778742049,12586269025};
/*
//FEHLER AB Nr.36 24157816.00
51 20365011074
52 32951280099
53 53316291173
54 86267571272
55 139583862445
56 225851433717
57 365435296162
58 591286729879
59 956722026041
60 1548008755920
61 2504730781961
62 4052739537881
63 6557470319842
64 10610209857723
65 17167680177565
66 27777890035288
67 44945570212853
68 72723460248141
69 117669030460994
70 190392490709135
71 308061521170129
72 498454011879264
73 806515533049393
74 1304969544928660
75 2111485077978050
76 3416454622906710
77 5527939700884760
78 8944394323791460 //(ende von Double 16 Stellen?)
79 14472334024676200
80 23416728348467700
81 37889062373143900
82 61305790721611600
83 99194853094755500
84 160500643816367000
85 259695496911123000
86 420196140727490000
87 679891637638612000
88 1100087778366100000
89 1779979416004710000
90 2880067194370820000
91 4660046610375530000
92 7540113804746350000
93 12200160415121900000
94 19740274219868200000
95 31940434634990100000
96 51680708854858300000
97 83621143489848400000
98 135301852344707000000
99 218922995834555000000
100 354224848179262000000
*/
void setup() {
pinMode(error, OUTPUT);
Serial.begin(19200);
delay(100);
Serial.println(F(" "));
Serial.println(F("Fibonacci Zahlen mit Kontrollfunktion bis 100"));
Serial.println(F(" "));
delay(100);
}
void loop() {
fpos++;
fib = x_a + x_b;
delay(TON);
x_a = x_b;
delay(TON);
x_b = fib;
delay(TON);
f_check = check[fpos];
Serial.print(F("Nr."));
Serial.print(fpos);
delay(TON);
if (f_check == fib) {
digitalWrite(error, LOW);
Serial.print(F(" Ergebnis plausibel"));
Serial.print(F(" Ist-Wert = "));
Serial.println(fib);
}
else {
analogWrite(error, 120); //LED ohne Vorwiderstand
fail++;
Serial.println(F(" "));
Serial.print(F("RECHEN_FEHLER Nr."));
Serial.println(fail);
Serial.print(F("Soll-Wert = "));
Serial.println(f_check);
Serial.print(F("Ist-Wert = "));
Serial.println(fib);
Serial.println(F(" "));
delay(2000);
}
if (fpos == 49) { //maximal Wert des Arrays-1 festlegen
fpos = 0;
fib = 0;
x_a = 0;
x_b = 1;
Serial.println(F(" "));
Serial.println(F("****RESET****"));
Serial.println(F(" "));
delay(TON);
}
}
Variante 2 mit pow() (Rundungsfehler durch pow() & ovf.)
const int fehler_led = 12;
const int TON = 1; //delay Zeit
unsigned int fib_n = 0; //zu errechnende Fibonacci-Zahl
double fib = 0;
double pow_1 = 0;
double pow_2 = 0;
double const_0 = 0;
//(5^0,5) = 2,2360679774997896964091736687313
double const_1 = 0;
//1/(5^0,5) = 0,44721359549995793928183473374625
double const_2 = 0;
//(5^0,5)/2 = 1,1180339887498948482045868343656
double const_3 = 0;
//(1-(5^0,5)) = -1,2360679774997896964091736687313
void setup()
{
pinMode(fehler_led, OUTPUT);
Serial.begin(19200);
delay(TON);
Serial.println(F("Fibonacci Rechner 1.0 Arduino"));
delay(TON);
const_0 = pow(5, 0.5);
delay(TON);
Serial.print(F("const_0 = "));
Serial.print(const_0, DEC);
Serial.println(F(" Soll = 2.2360680103"));
delay(TON);
const_1 = 1/const_0;
delay(TON);
Serial.print(F("const_1 = "));
Serial.print(const_1, DEC);
Serial.println(F(" Soll = 0.4472135901"));
delay(TON);
const_2 = const_0/2;
delay(TON);
Serial.print(F("const_2 = "));
Serial.print(const_2, DEC);
Serial.println(F(" Soll = 1.1180340052"));
delay(TON);
const_3 = 1-const_0;
delay(TON);
Serial.print(F("const_3 ="));
Serial.print(const_3, DEC);
Serial.println(F(" Soll =-1.2360680103"));
Serial.println(F(" "));
delay(1000);
}
void loop()
{
//(1/(const_0))*((((const_0)/2)^fib_n)-((1-const_0)/2)^fib_n)
// (const_1) * ((const_2) ^fib_n)- ((const_3) ^fib_n)
// (const_1) * pow_1 - pow_2
fib_n++;
pow_1 = pow(const_2, fib_n);
delay(TON);
//Serial.print(F("pow_1 = "));
//Serial.println(pow_1, DEC);
//delay(TON);
pow_2 = pow(const_3, fib_n);
delay(TON);
//Serial.print(F("pow_2 = "));
//Serial.println(pow_2, DEC);
//delay(TON);
fib = const_1 * (pow_1 - pow_2);
delay(TON);
Serial.print(F("Fibonacci Pos. = "));
Serial.println(fib_n);
Serial.print(F("Fibonacci Zahl = "));
Serial.println(fib);
Serial.println(F(" "));
if(fib == (fib+fib)/2) {
digitalWrite(fehler_led, LOW);
}
else {
analogWrite(fehler_led, 120);
Serial.println(F("********FEHLER********"));
delay(1000);
}
delay(TON);
}