Rechenfehler bei Berechnung von Funktionswerten einer quadratischen Funktion

Guten Tag,

ich möchte die Funktionswerte der quadratischen Funktion

f(i)=(0.0000038 * i^2 - 0.0076 * i + 4) * 1000

als ganzzahlige (es kommt nicht auf die exakte Rundung an, somit ist die Umwandlung von double in int durch "Abschneiden" zulässig) Werte berechnen lassen. Ich habe jetzt schon einiges ausprobiert und gelesen (Überlauf ist bei Werten dieser Größe auszuschließen, soweit ich das beurteilen kann), jedoch ergibt sich in einem bestimmten Zahlenbereich immer ein Rechenfehler. Dieser ist reproduzierbar und taucht immer an der gleichen Stelle auf:

[...]
2046
2040
2035
2030
2024
2019
2014
203992
3984
3977
3969
3962
3954
[...]

Der Code dazu ist der folgende:

void setup() {
  Serial.begin(9600);
  for (int i = 1; i <= 1001; i++) {
    double f = (0.0000038 * pow(i, 2) - 0.0076 * i + 4) * 1000;
    int t = (int)f;
    Serial.println(t);
  }
}

void loop() {
}

Fügt man nach jeder Iteration ein delay() von einigen Millisekunden ein, ändert sich die Position des Fehlers bis man bei delay(100) keinen Fehler mehr hat. Allerdings dauert die Berechnung dann eindeutig zu lange. Ich habe schon an einen vorher berechneten Array gedacht, der die Funktionwerte dann nur ausließt, allerdings ist mir das zu inflexibel, da ich langfristig eine Funktion mit variablen Koeffizienten brauche.

Ich habe den Code sowohl auf einem Arduino Mega 2560 als auch auf einem Arduino Nano laufen lassen, jeweils mit ähnlichem Fehlverhalten. Der Fehler ist bislang nur einmalig pro Schleife aufgetreten.

Kann mir jemand sagen woher der Fehler kommt und wie man diesen beheben kann?

Vielen Dank im Voraus!
Jonas

Kann den "Fehler" nicht reproduzieren.
Dein Code liefert bei mir stabil:

3992
3984
3977
3969
3962
3954
3946
3939
3931
3924
3916
3909
3901
3894
3886
3879
3871
3864
3856
3849
3842
3834
3827
3819
3812
3804
3797
3790
3782
3775
3768
3760
3753
3745
3738
3731
3724
3716
3709
3702
3694
3687
3680
3672
3665
3658
3651
3643
3636
3629
3622
3615
3607
3600
3593
3586
3579
3571
3564
3557
3550
3543
3536
3529
3522
3514
3507
3500
3493
3486
3479
3472
3465
3458
3451
3444
3437
3430
3423
3416
3409
3402
3395
3388
3381
3374
3367
3360
3353
3346
3339
3332
3326
3319
3312
3305
3298
3291
3284
3278
3271
3264
3257
3250
3243
3237
3230
3223
3216
3209
3203
3196
3189
3182
3176
3169
3162
3156
3149
3142
3136
3129
3122
3116
3109
3102
3096
3089
3082
3076
3069
3063
3056
3049
3043
3036
3030
3023
3017
3010
3003
2997
2990
2984
2977
2971
2964
2958
2951
2945
2939
2932
2926
2919
2913
2906
2900
2894
2887
2881
2874
2868
2862
2855
2849
2843
2836
2830
2824
2817
2811
2805
2798
2792
2786
2780
2773
2767
2761
2755
2748
2742
2736
2730
2724
2717
2711
2705
2699
2693
2687
2680
2674
2668
2662
2656
2650
2644
2638
2632
2625
2619
2613
2607
2601
2595
2589
2583
2577
2571
2565
2559
2553
2547
2541
2535
2529
2523
2517
2511
2505
2500
2494
2488
2482
2476
2470
2464
2458
2453
2447
2441
2435
2429
2423
2418
2412
2406
2400
2394
2389
2383
2377
2371
2366
2360
2354
2348
2343
2337
2331
2326
2320
2314
2309
2303
2297
2292
2286
2280
2275
2269
2264
2258
2252
2247
2241
2236
2230
2225
2219
2213
2208
2202
2197
2191
2186
2180
2175
2169
2164
2158
2153
2148
2142
2137
2131
2126
2120
2115
2110
2104
2099
2094
2088
2083
2077
2072
2067
2062
2056
2051
2046
2040
2035
2030
2024
2019
2014
2009
2003
1998
1993
1988
1983
1977
1972
1967
1962
1957
1951
1946
1941
1936
1931
1926
1921
1916
1910
1905
1900
1895
1890
1885
1880
1875
1870
1865
1860
1855
1850
1845
1840
1835
1830
1825
1820
1815
1810
1805
1800
1795
1790
1785
1780
1775
1771
1766
1761
1756
1751
1746
1741
1737
1732
1727
1722
1717
1713
1708
1703
1698
1693
1689
1684
1679
1674
1670
1665
1660
1656
1651
1646
1641
1637
1632
1627
1623
1618
1613
1609
1604
1600
1595
1590
1586
1581
1577
1572
1568
1563
1558
1554
1549
1545
1540
1536
1531
1527
1522
1518
1513
1509
1504
1500
1496
1491
1487
1482
1478
1473
1469
1465
1460
1456
1452
1447
1443
1438
1434
1430
1425
1421
1417
1413
1408
1404
1400
1395
1391
1387
1383
1378
1374
1370
1366
1362
1357
1353
1349
1345
1341
1336
1332
1328
1324
1320
1316
1312
1308
1303
1299
1295
1291
1287
1283
1279
1275
1271
1267
1263
1259
1255
1251
1247
1243
1239
1235
1231
1227
1223
1219
1215
1211
1207
1203
1200
1196
1192
1188
1184
1180
1176
1172
1169
1165
1161
1157
1153
1150
1146
1142
1138
1134
1131
1127
1123
1119
1116
1112
1108
1104
1101
1097
1093
1090
1086
1082
1079
1075
1071
1068
1064
1060
1057
1053
1050
1046
1042
1039
1035
1032
1028
1025
1021
1018
1014
1011
1007
1004
1000
997
993
990
986
983
979
976
972
969
966
962
959
955
952
949
945
942
939
935
932
929
925
922
919
915
912
909
905
902
899
896
892
889
886
883
879
876
873
870
867
863
860
857
854
851
848
845
841
838
835
832
829
826
823
820
817
814
811
808
804
801
798
795
792
789
786
783
780
777
775
772
769
766
763
760
757
754
751
748
745
742
740
737
734
731
728
725
723
720
717
714
711
709
706
703
700
697
695
692
689
687
684
681
678
676
673
670
668
665
662
660
657
654
652
649
647
644
641
639
636
634
631
629
626
623
621
618
616
613
611
608
606
603
601
598
596
593
591
589
586
584
581
579
577
574
572
569
567
565
562
560
558
555
553
551
548
546
544
541
539
537
535
532
530
528
526
524
521
519
517
515
513
510
508
506
504
502
500
497
495
493
491
489
487
485
483
481
479
477
474
472
470
468
466
464
462
460
458
456
454
452
450
449
447
445
443
441
439
437
435
433
431
429
428
426
424
422
420
418
417
415
413
411
409
408
406
404
402
401
399
397
395
394
392
390
388
387
385
383
382
380
378
377
375
374
372
370
369
367
365
364
362
361
359
358
356
355
353
352
350
348
347
345
344
343
341
340
338
337
335
334
332
331
330
328
327
325
324
323
321
320
319
317
316
315
313
312
311
309
308
307
305
304
303
302
300
299
298
297
296
294
293
292
291
290
288
287
286
285
284
283
282
281
279
278
277
276
275
274
273
272
271
270
269
268
267
266
265
264
263
262
261
260
259
258
257
256
255
254
253
252
252
251
250
249
248
247
246
245
245
244
243
242
241
241
240
239
238
237
237
236
235
235
234
233
232
232
231
230
230
229
228
228
227
226
226
225
224
224
223
223
222
221
221
220
220
219
219
218
218
217
217
216
216
215
215
214
214
213
213
212
212
211
211
211
210
210
209
209
209
208
208
208
207
207
207
206
206
206
205
205
205
204
204
204
204
203
203
203
203
202
202
202
202
202
202
201
201
201
201
201
201
200
200
200
200
200
200
200
200
200
200
200
200
200
200
200
200
200
200

losredoe132:
Kann mir jemand sagen woher der Fehler kommt und wie man diesen beheben kann?

Vermeide Bereichsüberläufe in Deinen Variablen!

Der gültige Bereich Deiner als int t" deklarierten Variablen reicht von -32768 im negativen Bereich bis zu 32767 im positiven Bereich.

Vielen Dank!
Erstaunlicherweise liefert der Algorithmus nach dem An- und Ausschalten des Arduino bei mir ebenfalls die richtigen Werte. Ich kann mir nicht erklären wie sowas zu Stande kommt, aber sofern es jetzt funktioniert ist ja alles bestens. Ich habe soeben herausgefunden, dass sich -zumindest bei mir- der Fehler doch reproduzieren lässt, wenn man void loop(){} mitausführt. Woran könnte das liegen?

void setup() {
  Serial.begin(9600);
  for (int i = 1; i <= 1001; i++) {
    double f = (0.0000038 * pow(i, 2) - 0.0076 * i + 4) * 1000;
    int t = (int)f;
    Serial.println(t);
  }
}
void loop(){
}

jurs:
Vermeide Bereichsüberläufe in Deinen Variablen!

Der gültige Bereich Deiner als int t" deklarierten Variablen reicht von -32768 im negativen Bereich bis zu 32767 im positiven Bereich.

Inwiefern kann das zu einem Problem führen? Die Funktionswerte sind ja im Intervall 4000 bis 200. Da bin ich ja weit entfernt von den integer-Wertebereichsgrenzen. Oder könnte die Potenzierung zum Problem werden? pow(i,2) liefert bereits für 182 einen Wert größer als 32767. Anderseits funktioniert es jetzt ohne einen größeren Datentyp wie z.B. long.

UNO und Nano liefern die selben Werte wie in #1. Die sind übrigens absteigend, während Deine aufsteigend sind.

wenn man void loop(){} mitausführt.

Was das bedeuten mag...?
Ich nicht wissen.

Ich habe den Fehler jetzt gefunden, denke ich. Aus irgendeinem Grund führen beide Arduinos bei mir nach etwas 0,8s einen "kleinen Neustart" aus. Bedeutet, dass die Built-In-Lampe einmal aufleuchtet und das Ausführen des Codes kurz unterbrochen wird. Ich habe keinen Schimmer wieso, aber mit einem delay(1000) am Anfang des setup lässt sich das Problem beheben.

void setup() {
  Serial.begin(9600);
  delay(1000);
  for (int i = 0; i <= 1000; i++) {
    double f = (0.0000038 * pow(i, 2) - 0.0076 * i + 4) * 1000;
    int t = (int)f;
    Serial.println(t);
  }
}
void loop(){}

combie:
Was das bedeuten mag...?
Ich nicht wissen.

Das Entfernen der Klasse (?) loop() führt bei mir zwar zu einer Fehlermeldung des Compilers, das Arduino Mega kann das Programm trotzdem ausführen und kommt auch auf die richtigen Funktionswerte.

void setup() {
  Serial.begin(9600);
  for (int i = 0; i <= 1000; i++) {
    double f = (0.0000038 * pow(i, 2) - 0.0076 * i + 4) * 1000;
    int t = (int)f;
    Serial.println(t);
  }
}

losredoe132:
Das Entfernen der Klasse (?) loop() führt bei mir zwar zu einer Fehlermeldung des Compilers, das Arduino Mega kann das Programm trotzdem ausführen und kommt auch auf die richtigen Funktionswerte.

loop() ist eine Funktion.

Der Rest ist abergläubischer Quatsch.

Das bisherige Programm wird in so einem Fall ausgeführt, niemals das neue.

Whandall:
loop() ist eine Funktion.

Der Rest ist abergläubischer Quatsch.

Das bisherige Programm wird in so einem Fall ausgeführt, niemals das neue.

Was meinst du mit bisherig und neu? Kannst du mir den abergläubischen Quatsch den plausibel erklären? Denn es macht zumindest bei mir tatsächlich einen Unterschied ob ich die Funktion (danke) loop mit in den Code schreibe oder nicht.

Das Entfernen der Klasse (?) loop() führt bei mir zwar zu einer Fehlermeldung des Compilers, das Arduino Mega kann das Programm trotzdem ausführen

Eine Illusion!

Mein Kompiler sagt dann:

undefined reference to `loop'

Und bricht ab.

Kein Kompilieren -> kein Upload -> keine Änderung des bisherigen Flash-Inhalts
-> alter, bisheriger, letzter,... Sketch wird nach Reset ausgeführt.

Ah, jetzt verstehe ich es auch. Vielen Dank für eure Geduld!

2019
2014
203992
3984
3977

Das, was du da zeigst ist kein Rechenfehler!

Sondern das Resultat eines Reset.

combie:
Das, was du da zeigst ist kein Rechenfehler!

Sondern das Resultat eines Reset.

Ja, das hab ich jetzt auch als Problem identifiziert. Da ich den Restknopf nicht drückte, resetet sich mein Arduino scheinbar selbst. Was könnte die Ursache sein?

losredoe132:
Ja, das hab ich jetzt auch als Problem identifiziert. Da ich den Restknopf nicht drückte, resetet sich mein Arduino scheinbar selbst. Was könnte die Ursache sein?

Arduino-Boards haben eine "Auto-Reset" Funktion beim Öffnen des seriellen Monitors.
Wenn praktisch im selben Moment, in dem der serielle Monitor geöffnet wird, ein Reset auftritt, dann ist das die Auto-Reset Funktion des Boards.

Na ja, beim Öffnen des Monitors ist dieser leer,
das kann also nicht das Reset mitten in der Ausgabe erklären.

Ohne den vollständigen Kode kann man nicht mehr sagen.

Der Brownout, oder der WDT können noch einen spontanen Reset auslösen.

Whandall:
Ohne den vollständigen Kode kann man nicht mehr sagen.

Ich bin von dem Code ausgegangen, den der Themenstarter zu Beginn des Themas gepostet hat.

Und ich konnte bei mir keine Resets während der laufenden Ausgabe feststellen (IDE Version 1.8.1, UNO-kompatibles Board, Windows-PC)

Ich bezweifle dass der vollständige Kode geposted wurde.

Hallo,
ich denke, dass eine leere Funktion mindestens ein Semikolon enthalten muss. Der Compiler macht dann daraus den Befehl "NÓP" = no Operation.
void loop(){;}
Gruß Manfred