Go Down

Topic: Increment und Decrement Variable! (Read 1 time) previous topic - next topic

Tommy56

Das Problem ist hier bei der Rechnung es sollte halt so genau wie möglich sein daher habe ich Float genommen
Dann hast Du es nicht verstanden.

Float kann maximal 6 signifikante Stellen darstellen.
Das Maximum von unsigned long ist 4.294.967.295, also bis zu 10 signifikanten Stellen. Damit ist die Ganzzahldarstellung wesentlich genauer.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

7ower3efender

Dann hast Du es nicht verstanden.

Float kann maximal 6 signifikante Stellen darstellen.
Das Maximum von unsigned long ist 4.294.967.295, also bis zu 10 signifikanten Stellen. Damit ist die Ganzzahldarstellung wesentlich genauer.

Gruß Tommy

Das Problem ist ich kann zwar mit Ganzzahlen berechnen aber im Schluss sind die meisten Ergebnisse dann keine Ganzzahlen mehr und die 10 Signifikanten Stellen sind bei der Berechnung bei mir sehr schnell voll da ich die Nachkommastellen ja auch in Ganzzahlen umwandle.

Doc_Arduino

#32
May 22, 2019, 06:28 pm Last Edit: May 22, 2019, 06:28 pm by Doc_Arduino
Hallo,

ich würde mich wirklich gern nochmal aufrappeln, aber ich verstehe dein Gedankenproblem wirklich nicht um es zu korrigieren. Zudem du jetzt zusätzlich die Nachkommastellen wieder in Ganzzahlen umwandeln möchtest. Da bietet es sich doch regelrecht an alles in Ganzzahlen zu rechnen und dann entsprechend zu splitten. Alles ganz ohne Fließkommarechnung.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

7ower3efender

Hallo,

ich würde mich wirklich gern nochmal aufrappeln, aber ich verstehe dein Gedankenproblem wirklich nicht um es zu korrigieren. Zudem du jetzt zusätzlich die Nachkommastellen wieder in Ganzzahlen umwandeln möchtest. Da bietet es sich doch regelrecht an alles in Ganzzahlen zu rechnen und dann entsprechend zu splitten. Alles ganz ohne Fließkommarechnung.
Wie kann ich zum Beispiel das mit Ganzzahlen Berechnen wenn ich 50Meter durch 200 000 Mikrosekunden dividiere bekomm ich ja wieder eine Kommazahl raus die erst wenn ich es Multipliziere mit 1 000 000 stimmen würde aber so weit komme ich gar nicht da er es gar nicht rechnet??

Zu Mikrosekunden würde ich es ja gleich so weiter rechnen das kein Komma entsteht aber das Ergebnis wäre bevor ich es Multipliziere eine Kommazahl.

Doc_Arduino

Hallo,

multipliziere erst 50m * 1000.000 und teile dann durch 200.000µs.
Der µC rechnet alles der Reihenfolge nach wenn keine Klammern angegeben sind.
Vielleicht war das der Knackpunkt.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

7ower3efender

Hallo,

multipliziere erst 50m * 1000.000 und teile dann durch 200.000µs.
Der µC rechnet alles der Reihenfolge nach wenn keine Klammern angegeben sind.
Vielleicht war das der Knackpunkt.
Das passt zwar aber wie kann ich da dann das Ergebnis splitten das ich dann auch Kommastellen anzeigen kann??

agmue

#36
May 22, 2019, 07:10 pm Last Edit: May 22, 2019, 07:12 pm by agmue
Das passt zwar aber wie kann ich da dann das Ergebnis splitten das ich dann auch Kommastellen anzeigen kann??
Code: [Select]
void setup() {
  Serial.begin (9600);
  float fWert = 1234.56;
  float fErgebnis = fWert / 2;
  Serial.print("fErgebnis: ");
  Serial.print(fErgebnis);
  unsigned long iWert = 123456; // 1234.56*100
  unsigned long iErgebnis = iWert / 2;
  Serial.print("\tiErgebnis: ");
  Serial.print(iErgebnis / 100.0);
  Serial.println();
}

void loop() {}

"100.0" wandelt das Ergebnis in Fließkomma.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Doc_Arduino

Hallo,

wie hättest du denn das Ergebnis 250 dargestellt?
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

7ower3efender

#38
May 22, 2019, 07:15 pm Last Edit: May 22, 2019, 07:34 pm by 7ower3efender
Hallo,

wie hättest du denn das Ergebnis 250 dargestellt?

Also so so das halt zwei Nachkommastellen dargestellt werden also zum Besipiel "250","00" m/s
Also so das ich halt dann auf zwei Nachkommastellen genau das Ergebnis Ausgeben kann aber dazu fehlt mir das Know-How da ich nicht so viel mit Arduino oder besser geasgt generell mit Programmieren am Hut habe.

Edit: Und wenn ich mit der Zahl ja dann weiter Rechne habe ich ja dann auch wieder einen Verlust der Genauigkeit oder nicht??
Wie schaffe ich es dann mit zwei Nachkommastellen weiter zu rechnen??
Ich habe es gerade probiert die zahl 50 statt mit 1 000 000 zu Multiplizieren mit 100 000 000 zu Multiplizieren und diese Zahl dann am Schluss per Serial Monitor mit 100.0 zu Dividieren doch er dividiert durch 10 statt durch 100.

agmue

... aber dazu fehlt mir das Know-How ...
Dann kaufe Dir einen Teensy 3.5 mit Gleitkommaprozessor, der rechnet dann wie ein Taschenrechner.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Doc_Arduino

#40
May 22, 2019, 07:31 pm Last Edit: May 22, 2019, 07:33 pm by Doc_Arduino
Hallo,

wenn man rein mit Ganzzahl rechnet würde ich das so machen, man nutzt das was der µC mit abschneiden macht zu seinem Vorteil.
Code: [Select]

void setup(void) {
  Serial.begin(9600);

  dreiStellen(123456789);
  dreiStellen(4123456789);
  dreiStellen(1234);

  zweiStellen(123456789);
  zweiStellen(4123456789);
  zweiStellen(1234);
}

void loop(void) {
  
}

// ****** Funktionen ******
void dreiStellen (unsigned long var)
{
  unsigned long zahl = var/1000;          
  unsigned long komma = var-(zahl*1000);
  Serial.print(zahl);
  Serial.print('.');
  Serial.println(komma);
}

void zweiStellen (unsigned long var)
{
  unsigned long zahl = var/1000;        
  //unsigned long komma = (var-(zahl*1000))/10;         // ohne runden
  unsigned long komma = (var-(zahl*1000))*1.0/10+0.5; // mit runden
  Serial.print(zahl);
  Serial.print('.');
  Serial.println(komma);
}
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Serenifly

32-Bit Prozessoren generell haben schon mal eine höhere Genauigkeit da die mit 64-Bit Gleitkommazahlen arbeiten. Eine extra Gleitkomma-Einheit dient eher der Geschwindigkeit

agmue

@Serenifly: Danke für den Hinweis, werde ich mit meinem Teensy 3.2 mal testen.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

7ower3efender

Dann kaufe Dir einen Teensy 3.5 mit Gleitkommaprozessor, der rechnet dann wie ein Taschenrechner.

Kann man den ebenfalls per Arduino IDE programmieren oder ist dies wieder anders und wäre das zum Beispiel der Richtige??

Link: https://www.reichelt.at/teensy-3-5-usb-teensy-3-5-p191452.html

Doc_Arduino

Bedenke, Programmierdefizite kann man nicht durch Hardware ersetzen.
Die Ablenkung in diese Richtung halte ich für komplett falsch und führt zu nichts.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up