Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » float Probleme beim runden.

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.11.2003, 15:40 Uhr
BeS



Hallo,
ich habe ein Problem. Ich muß eine float Zahl auf eine Stelle nach dem Komma Runden und danach überprüfen ob sie in einem bestimmten Intervall ist.

Ich habe mal ein kleines Testprogramm geschrieben:

C++:
int main()
{
  float x=1.13333333;

  x = ((int)(x*10))/10.0;

  printf("\t%f\n", x);

  if (x <= 1.1)
    printf("kleiner-gleich 1.1\n");
  else
    printf("NICHT kleiner-gleich 1.1\n");
  
  printf("\n%f\n", x);
  return 0;
}



Hier sollte die Zahl jetzt auf 1.1 gerundet werden und müsste dann <= 1.1 sein.
Wenn ich das Programm laufen lassen wird am Ende auch die Zahl 1.10000 ausgegeben, allerdings erkennt die if Abfrage nicht das die Zahl <= 1.1 ist.
Als Notlösung habe ich mir schon überlegt ob ich die Zahl nicht einfach mal 10 nehmen soll und dann als integer vergleiche...
--
If art interprets our dreams, the computer execute them in the guise of programs!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.11.2003, 15:48 Uhr
Pablo
Supertux
(Operator)


Bzgl float haben wir vor 2 Tagen (glaube ich) schon besprochen:
www.fun-soft.de/showtopic.php?threadid=5105


C++:
#include <stdio.h>
#define EPSILON 0.001
int main()
{
  float x=1.13333333;

  x = ((int)(x*10))/10.0;

  printf("\t%f\n", x);

  if (x <= 1.1+EPSILON)
    printf("kleiner-gleich 1.1\n");
  else
    printf("NICHT kleiner-gleich 1.1\n");

  printf("\n%f\n", x);
  return 0;
}



Mit float und double muss man mit einer Umbegung arbeiten, da es immer auf Rundungsfehlern kommt (wenn ich ich micht irre).


Bearbeitung von Pablo:

Ich denke um wirklich sicher zu sein, dass auch die Genauigkeit gepr+ft wird:

C++:
#include <stdio.h>
#define EPSILON 0.001
int main()
{
  float x=1.13333333;

  x = ((int)(x*10))/10.0;

  printf("\t%f\n", x);

  if (x <= 1.1+EPSILON || ( x<1.1+EPSILON && x>1.1-EPSILON))
    printf("kleiner-gleich 1.1\n");
  else
    printf("NICHT kleiner-gleich 1.1\n");
  
  printf("\n%f\n", x);
  return 0;
}


Könnte sein, dass ich jetzt Miste baue, aber wenn du x <= 1.1+EPSILON mit 0 ersetzt, so dass ( x<1.1+EPSILON && x>1.1-EPSILON) ausgeführt wird, genau dann x nicht kleiner als 0.1 ist, dann kommt "kleiner gleich 1.1" raus.


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 30.11.2003 um 15:55 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.11.2003, 18:39 Uhr
Tommix



Hallo,
Du kannst den von Pablo erwähnten Fehler sichtbar machen, wenn Du

C++:
printf("\n%f\n", x-1.1);


schreibst.

Gruss, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: