Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » float immer abrunden?

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 ] > 2 <
010
06.09.2003, 15:00 Uhr
0xdeadbeef
Gott
(Operator)


Oh. *ähem* In dem Fall:

C++:
double wert = 1.38;
printf("%.1lf\n", wert);


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
06.09.2003, 17:02 Uhr
BeS



Hallo 0xdeadbeef,


Zitat:
0xdeadbeef postete
Oh. *ähem* In dem Fall:

C++:
double wert = 1.38;
printf("%.1lf\n", wert);





hiermit wird aber auch aufgerundet, d.h. aus 1.38 wird 1.4!

Mir ist aber beim rumspielen noch was ganz anderes aufgefallen. Ich habe ein paar Zahlen mit diesem kleinen Testprogramm getestet:

C++:
#include <stdio.h>

double round (double x)
{
  return ((int) (x * 10 + 0.5L)) / 10.0L;
}

int main()
{
  double zahl = 1.35;

  printf("mit Funktion %lf\n", round(zahl));
  printf("ohne Funktion %.1lf\n\n", zahl);
  
  return 0;
}



Die Ausgabe:
mit Funktion 1.400000
ohne Funktion 1.4

Wenn ich jetzt die Zahl in 1.45 ändere bekomme ich die gleiche Ausgabe!
Bei 1.55 wird dann wieder auf 1.6 aufgerundet und bei 1.65 wird wieder auf 1.6 abgerundet!!!

Kann sich das jemand erklären...

PS: Deine Funktion sollte doch eigentlich immer aufrunden, oder?
Also wenn ich z.B. 1.32 haben:
1.32 * 10 = 13.2; 13.2 + 0.5 = 13.7 -> (int) 14; 14/10.0 = 1.4
Die Funktion rundet bei mir aber ganz normal, wie es %.1f auch macht...
--
If art interprets our dreams, the computer execute them in the guise of programs!

Dieser Post wurde am 06.09.2003 um 17:02 Uhr von BeS editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
06.09.2003, 17:37 Uhr
0xdeadbeef
Gott
(Operator)



Das hätt ich jetzt nicht erwartet. So wies aussieht, liegt der Fehler beim Casten nach int. Wenn ich das (int) rausnehme und der Funktion 1.45 füttere, krieg ich 1.5 zurück. Die Funktion sollte eigentlich immer runden, also 1.45 -> 1.5, 1.44 -> 1.4 usw.
Kann das mal jemand mit nem anderen Compiler als dem gcc übersetzen und sehen, was dabei rauskommt?

Was dein Problem angeht: In Funktionsform gepresst kann man das dann so machen:

C++:
double round_down(double x) { return ((int) (x * 10.0L)) / 10.0L; }


respektive

C++:
#define round_down(x) (((int) ((x) * 10.0L)) / 10.0L)


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
06.09.2003, 20:37 Uhr
BeS



Hallo,
erstmal Danke! Das funktioniert jetzt soweit!

Zu dem komischen Verhalten, deiner round Funktion, bei destimmten Werten habe ich noch was entdeckt.

Das Problem tritt nämlich nur dann auf wenn du den Wert in Quellcode setzt, also wie bei meinem Beispiel oben.
Wenn ich in einer for-Schleife durch die verschiedenen Wert durchgehe werden alle richtig gerundet! Also ich kann mir das Verhalten nicht erklären


C++:
double round (double x)
{
  return ((int) (x * 10 + 0.5L)) / 10.0L;
}

int main()
{
  double zahl = 1.35;
  int i;

  for(i=1; i < 8; i++)
    {
      printf("Zahl %lf\n", zahl);
      printf("mit Funktion %.1lf\n", round(zahl));
      printf("ohne Funktion %.1lf\n\n", zahl);
      zahl = zahl + 0.1L;
    }
  return 0;
}


--
If art interprets our dreams, the computer execute them in the guise of programs!

Dieser Post wurde am 06.09.2003 um 20:38 Uhr von BeS editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ 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: