Fließkommazahl errechne die nächst größeren Ganzzahl
-
Du kannst ja mit 1 als erste Schätzung anfangen, und die Zahl solange verdoppeln, bis sie nicht mehr kleiner als die Eingangszahl ist. Dann hast Du eine obere Grenze. Die untere Grenze wäre dann genau halb so groß und anschließend halbierst Du dieses Intervall sukzessiv, bis der Abstand der Grenzen ==1 ist. Dann ist die obere Grenze das Ergebnis.
Für negative Eingangszahlen musst Du es Dir selber nochmal überlegen.Gruß
Werner
-
Naja, durchprobieren ist etwas doof.
Es gibt schon eine ansatzweise brauchbare Variante wie man das implementieren kann.Kurzform: die Zahl so lange halbieren bis man 1,xxxxxxxx hat (mitzählen). Dann das ganze wieder rückwärts, wobei man immer den 1er vorne wegnimmt.
Wenn man fertig ist, hat man (nur mehr) die Nachkommastellen der ursprünglichen Zahl.Damit sollte sich dann arbeiten lassen.
EDIT: OK, die Variante von Werner ist auch gut.
Wobei man ein Problem bei riesen Zahlen bekommen wird. Also welche die grösser als die Mantisse sind. Da müsste man zumindest tricksen.
-
Ha HABE ES!!!!!!!!!!!!!!!!!!!!!!!!!
DANKE DANKE DANKE!!!
void Test(double d_in) { for (int int_Zahl = INT_MIN; int_Zahl <= INT_MAX ; int_Zahl++ ) { if( int_Zahl > int(d_in)) { cout << int_Zahl << "\n"; return; } } } void main() { cout << "ceiling(3.14) = "; Test(3.14); cout << "ceiling(-5.67) = "; Test(-5.67); system("pause"); }Jetzt entspricht alles der Aufgabe!!!
Herzlichen Dank für den Denkanstoß und so
Wünsche eine gute Nacht!
-
Ähm, da solltest nochmal ganz genau drüber nachdenken, vor allem über das int(d_in)...war das nicht verboten? Und wenn du das schon machst, wofür dann überhaupt der ganze Rest!?
-
Ja hatte noch den alten Code....sorry...
es muss natürlich{ if( int_Zahl > int(f_in)) {heißen nicht
größer gleich.... soll ja den nächst größere Zeigen.
Vergleiche sind expizit erlaubt!Vergleichsoperationen wie >, ≥ etc. zwischen Fließkommazahlen und Ganzzahlen sind gestattet.
DANKE!
-
int(f_in) ist aber eine Typumwandlung. Lass das einfach weg...
btw: Was ist mit negativen Zahlen?
-
dot schrieb:
Und wenn du das schon machst, wofür dann überhaupt der ganze Rest!?
Welcher Rest?? Was meinst du?
INT_MIN <- Minimum von Integer (in <climits> festgelegt)
INT_MAX <- Maximum von Integer
void main()
{
cout << "ceiling(3.14) = "; //Ausgabe damit es so aussieht wie in der Aufgabenstellung
Test(3.14);
cout << "ceiling(-5.67) = ";
Test(-5.67);
system("pause"); //Erzeugt ein "HALT"....damit die Konsole offen bleibt
}
-
dot schrieb:
int(f_in) ist aber eine Typumwandlung. Lass das einfach weg...
btw: Was ist mit negativen Zahlen?Naja denke die Typumwandlung geht in Ordnung.
Stimmt mit negativen Zahlen ist das Ergebnis zwar mathematisch richtig. Also der nächst größere Integer aber nicht nach Beispiel. Mhhhh....ach ich hasse das.
Hat jemand eine Idee??
-
Meine Lösung....
void Test(double d_in) { for (int int_Zahl = INT_MIN; int_Zahl <= INT_MAX ; int_Zahl++ ) { if( int_Zahl > int(d_in)) { if(int_Zahl >= 0) { cout << int_Zahl << "\n"; } else { cout << int_Zahl - 1 << "\n"; } return; } } } void main() { cout << "ceiling(3.14) = "; Test(3.14); cout << "ceiling(-5.67) = "; Test(-5.67); cout << "ceiling(0.67) = "; Test(0.67); system("pause"); }Nicht schön aber selten......und so stimmt die Ausgabe!
ceiling(3.14) = 4
ceiling(-5.67) = -5Und mit 0.XX läuft es auch...
Ausgabe:
ceiling(3.14) = 4
ceiling(-5.67) = -5
ceiling(0.67) = 1
Drücken Sie eine beliebige Taste . . .
-
Aber du verwendest immer noch die verbotene Typumwandlung und diese Lösung ist wahnsinnig langsam...
-
dot schrieb:
Aber du verwendest immer noch die verbotene Typumwandlung und diese Lösung ist wahnsinnig langsam...
Ja ich weiß...ist aber ne Klausur/Hausaufgabe....auf Speed kommt es nicht an. Und ja du hast recht ohne ist es besser. Scheinbar rundet int(XX)....
so jetzt habe ich es...ohne Typenumwandlung....void Test(double d_in) { for (int int_Zahl = INT_MIN; int_Zahl <= INT_MAX ; int_Zahl++ ) { if( int_Zahl > d_in) { cout << int_Zahl << "\n"; return; } } }Benutzt INT_MIN/INT_MAX nur um den ganzen Bereich abzudecken.
ceiling(3.14) = 4
ceiling(-5.67) = -5
ceiling(0.67) = 1
Drücken Sie eine beliebige Taste . . .
-
magier-phil schrieb:
dot schrieb:
Aber du verwendest immer noch die verbotene Typumwandlung und diese Lösung ist wahnsinnig langsam...
Ja ich weiß...ist aber ne Klausur/Hausaufgabe....auf Speed kommt es nicht an. Und ja du hast recht ohne ist es besser. Scheinbar rundet int(XX)....
Nö, int(XX) rundet nicht, es schneidet einfach den Nachkommateil weg ("truncate").