FLOAT BERECHNUNG

Gast #36774
Hallo

...und zwar sollte die variable [test] rechnerisch am ende den wert 8
haben...
sie hat aber den wert 7.

sind das rundungsfehler ?

void main ()
{
  float value;
  unsigned char test;

  value = 1.8;

  test = 1;

  value = (value-(float)test)*10;

  test = (unsigned char)value;

  while(1);
}

SO WÜRDE ES FUNKTIONIEREN:

void main ()
{
  float value;
  unsigned char test;

  value = 1.8;

  test = 1;

>>>  value = (value*10-(float)test*10); <<<

  test = (unsigned char)value;

  while(1);
}

wieso?

danke
Gast
Hallo Stephan !!

Bei einer Konvertierung von float nach int werden die
Nachkommastellen immer abgeschnitten.

(value-(float)test)*10 ergibt in deinem Fall 7.9999952

abgerundet also 7.

Wenn du dies umgehen willst kannst du entweder immer versuchen es auf
deine 2. Art zu machen, oder schöner du verwendest die Funktion
ceil (). Müssest du in Math.h finden. Diese rundet einen float-wert
auf die nächste ganze Zahl auf.

Andre
Gast
Bei float -> int mußt Du runden!
Offensichtlich wird bei Deinen float-Routinen intern 1.8 als 1,799999
dargestellt und bei float -> int abgeschnitten.
Gast
>einfach vor dem cast nach int 0,5 dazuaddieren und fertig.

Das ist einfach falsch.
Bei einer Rundung muß immer das Vorzeichen beachtet werden. Es gibt
zwar Teufel, die davon ausgehen, daß negative Zahlen nicht auftreten,
aber das sind eben die Teufel !
Gast
floor () und ceil () geben beide float-Werte zurück.
Diese mußt du dann noch nach int konvertieren.

Am besten schaust du dir einfach mal eine Beschreibung der
Funktionen an..

Meiner Meinung nach ist dies die sauberste Art zu runden. Welche
du verwendest hängt von deiner Anwendung ab.
Es gibt soweit ich weiss auch eine Funktion die "richtig" rundet,
aber mir fällt der Name gerade nicht ein. :-)

Andre

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.