PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Multiplikation falsch??



fredyxx
18.05.2016, 17:56
Hallo,

an dieser Stelle ** Serial.println (x); *** zeigt der Serielle Monitor ein Ergebnis von 53624.64.
Richtig wäre jedoch 45612.1192716036 !!

Und 1000 * 1000 ist 16960.00!!??

Wie kann das sein?



// **************************************Unterprogram m lzahn2Prog *******************************
float lzahn2Prog ( float x1, float y1) {

// float P0_P1 = sqrt(pow(x1,2) + pow(y1,2)); //Gerade P0-P1
float P0_P1 = sqrt(x1 * x1 + y1 * y1); //Gerade P0-P1

float CosinusW4 = (114196 - pow(P0_P1, 2)) / 102960;
float W4 = acos(CosinusW4); // die Ausgabe erfolgt im Bogenmaß
float lzahn2 = sqrt( (21164.49 - cos (W4 + 3.14159265358979323846 / 180 * 5.26)) * 20574 );

double x = 231.56994*231.56994;
Serial.print ("x = ");
Serial.println (x);
Serial.println (CosinusW4);
Serial.println (W4);
delay(2000);
return lzahn2; // die Ausgabe erfolgt im Bogenmaß
}


Gruß
fredyxx

Unregistriert
18.05.2016, 19:02
an dieser Stelle ** Serial.println (x); *** zeigt der Serielle Monitor ein Ergebnis von 53624.64.
Richtig wäre jedoch 45612.1192716036 !!

Wie kommst du drauf, daß "double x = 231.56994*231.56994;" 45612.1192716036 wäre?

fredyxx
18.05.2016, 19:37
Wie kommst du drauf, daß "double x = 231.56994*231.56994;" 45612.1192716036 wäre?

Frage ich mich nun auch! Weil ich in Excel mit der richtigen Zahl nämlich 213,56994 und im Arduino mit der verdrehten 231.56994 gerechnet habe. 3 x kontrolliert und doch verkehrt!!

Der Fehler wurde ja auch noch bestätigt, weil 1000 * 1000 immer noch 16960.00 ergibt!!??

Das ist aber nun kein Dreher.

Gruß
fredyxx

HaWe
18.05.2016, 19:51
hallo,
du weißt aber schon, dass bei AVRs mit der Arduino IDE double dasselbe ist wie float? (max. 7-8 digits)

und wo ist die Zeile mit 1000*1000?
1000*1000 ist 1 Mio, das ist long, nicht int, und auch nicht float!
ps,
ich würde bei float-Arithmetik mit Konstanten auch immer einen Dezimalpunkt setzen, damit der Compiler nicht fälschlich mit Integer-Arithmetik rechnet!

also:
x/180.0, nicht x/180 !

fredyxx
18.05.2016, 22:09
du weißt aber schon, dass bei AVRs mit der Arduino IDE double dasselbe ist wie float? (max. 7-8 digits)

Nein, wusste ich nicht


und wo ist die Zeile mit 1000*1000?
1000*1000 ist 1 Mio, das ist long, nicht int, und auch nicht float!

Die habe ich mal versuchsweise hinter double x = eingegeben und erhielt dann das Ergebnis 16960.00


ich würde bei float-Arithmetik mit Konstanten auch immer einen Dezimalpunkt setzen, damit der Compiler nicht fälschlich mit Integer-Arithmetik rechnet!

Der Tipp ist sehr gut, denn 1000.0 * 1000.0 ist dann auch tatsächlich 1000000 . Hurra. Sehr seltsam. Das habe ich so auch noch nicht gelesen, aber sicher steht es irgendwo im Arduino-Universum

DANKE

Gruß
fredyxx

Klebwax
18.05.2016, 22:46
Der Tipp ist sehr gut, denn 1000.0 * 1000.0 ist dann auch tatsächlich 1000000 . Hurra. Sehr seltsam. Das habe ich so auch noch nicht gelesen, aber sicher steht es irgendwo im Arduino-Universum

Das "Arduino-Universum" ist sicher nicht der kompetente Ort für solche Fragen. Hier geht es um C bzw. C++ und da hilft ein Buch über C eher weiter.

MfG Klebwax

fredyxx
18.05.2016, 22:52
Gibt die Konsole FließkommaZahlen immer nur mit 2 Stellen hinter dem Punkt aus oder kann man das ändern?

Gruß
fredyxx

Rabenauge
19.05.2016, 00:53
Kann man.
https://www.arduino.cc/en/serial/print

fredyxx
20.05.2016, 10:21
Kann man.
https://www.arduino.cc/en/serial/print

DANKE

Gruß
fredyxx