ceil / floor Ergebnis an int zuweisen definiert?

21/01/2015 - 16:56 von Heinz Saathoff | Report spam
Hallo,

für eine Rundung will ich das Ergebnis von floor oder ceil an einen
Integer zuweisen und möchte dabei vermeiden, dass es durch
Ungenauigkeiten zu einem um +/- 1 falschen Wert kommt.
Ich habe ein Testprogramm unter Win-XP mit einem alten C-Compiler
getestet und hier hat sich floor/ceil wie gewünscht verhalten.
Aber ist das garantiert?


- Heinz


/******** TESTPROGRAMM *********/
#include <stdio.h>
#include <math.h>

int main(int argc, char *argv[])
{
double dval=0.0;
int ival=0;
while(ival < 1000000) {
dval += 1.000000001;
ival += 1;
int i_floor = floor(dval);
int i_ceil = ceil(dval);
if(ival != i_floor) {
/* kann das vorkommen? */
printf("floor: %d != %d", ival, i_floor);
}
if(ival+1 != i_ceil) {
/* oder auch dies? */
printf("ceil: %d != %d", ival+1, i_ceil);
}
}//while
return 0;
}//main
 

Lesen sie die antworten

#1 Stefan Reuther
21/01/2015 - 18:46 | Warnen spam
Heinz Saathoff wrote:
double dval=0.0;
int ival=0;
while(ival < 1000000) {
dval += 1.000000001;
ival += 1;
int i_floor = floor(dval);
int i_ceil = ceil(dval);
if(ival != i_floor) {
/* kann das vorkommen? */



Ich würde mich mal soweit aus dem Fenster lehnen und zu sagen: ja, das
klappt (=kann nicht vorkommen), solange du keine Wertebereiche verlàsst.

Insbesondere hast du in deinem Beispiel recht zivile Wertebereiche. Ein
double hat auf quasi allen praxisrelevanten Plattformen deutlich mehr
Mantissenbits als ein int, salopp gesagt wird der double also immer den
für ceil/floor relevanten Ganzzahlanteil der Zahl komplett speichern.

Das schlàgt fehl, wenn der double ganze Zahlen nicht mehr darstellen
kann, und statt 1.00000001 eben 2 addiert.


Stefan

Ähnliche fragen