Zwei grosse Integer teilen mit float als Ergebnis

Hallo,

ich stehe vor einem Problem, bei dem ich das Gefuehl habe, dass es schon gute Loesungswegen geben muesste, aber ich kenne gerade keine.

Also, ich habe eine Bibliothek, die bigints (also quasi beliebig grosse Integer) handhaben kann, und die bietet fast alle interessanten Operationen an, inklusive arithmetik (+, -, *, divmod (also eine division, dir mir auch noch den modulos gibt)) und Konvertierung nach „double“ (also 64-bit floating point).

Jetzt moechte ich manchmal einen Quotienten von zwei bigints als double berechnen, also z.B.

203**200 / 200 ** 200 = 19.6430286394751

Wenn ich jetzt Zaehler und Nenner beide nach double umwandel, bekomme ich Inf / Inf = NaN, also nicht das Ergebnis, das ich brauche.

Was waere denn ein besseres Vorgehen?

Ich dachte, dass wenn ich a/b rechnen will, rechne ich erstmal den integer-teil aus (indem ich divmod mache), und dann rechne ich mit dem Rest weiter. Dann muss ich noch den Rest durch b teilen, dabei kommt dann aber wieder ein Inf im Nenner vor.

Oder ich koennte Zaehler und Nenner vor der Umwandlung in double durch die gleiche Zahl teilen, irgendwie steh ich aber gerade auf dem Schlauch, wie ich die am besten abschaetzen soll.

Ueber Hinweise freue ich mich, ebenso ueber Nachfragen, falls sich meine Frage etwas konfus anhoert :smile:

Gruesse,
Moritz

Hallo Moritz,

welche Programmierungssprache benutzen Sie? Ich würde nur das
Ergebnis in einem 64-bit float umwandeln - lassen Sie lieber
die Division mit den Bibliotheken-Routinen selbst rechnen. Da
die Bibliotheken-Routine das Modulo zurück gibt, ist es einfach
das Ergebnis auf der Fließkommazahl-Repräsentation umzuwandeln.

Gruß,

Carlo.

Hallo,

welche Programmierungssprache benutzen Sie?

C

Ich würde nur das
Ergebnis in einem 64-bit float umwandeln - lassen Sie lieber
die Division mit den Bibliotheken-Routinen selbst rechnen.

Welches Ergebnis genau? Wenn ich nur Integer-Division mache, verliere ich die Nachkommastellen.

Da
die Bibliotheken-Routine das Modulo zurück gibt, ist es
einfach
das Ergebnis auf der Fließkommazahl-Repräsentation
umzuwandeln.

Aehm, wie denn?
Wenn ich das Modulo habe, und in eine Fliesskommazahl umwandle, muss ich das immer noch durch den Nenner teilen, der als Fliesskommazahl nicht darstellbar ist, weil zu gross.

Oder als Formeln, wenn ‚div‘ die Integer-Division ist, kann ich zwar a/b schreiben als

a div b + (a mod b) / b

aber dann weiss ich immer noch nicht, wie ich (a mod b) / b auswerten kann.

Gruesse,
Moritz

Hi,

den Zähler mit einer genügend großen 10er oder 2er-Potenz multiplizieren, den Integerteil des entstehenden Bruches ausrechnen und dann durch dieselbe 10er oder 2er-Potenz dividieren.

Ciao Lutz

PS: Wobei 203^200/200^200 besser als (1+3/200)^200 approx e^3 zu bestimmen ist, aber das soll ja wahrscheinlich nachgerechnet werden.

Hallo Moritz,

meine erste Antwort war ein bissen zu schnell geschrieben.
Um welche Bibliothek handelt es sich?

Schöne Grüße,

Carlos.

Hallo Moritz,

Oder als Formeln, wenn ‚div‘ die Integer-Division ist, kann
ich zwar a/b schreiben als

a div b + (a mod b) / b

aber dann weiss ich immer noch nicht, wie ich (a mod b) / b
auswerten kann.

((float)(a div b)) + (((float)((1000. * (a mod b)) / b) / 1000.)

1’000 ergäbe 3 Nachkommastellen.

Eine andere Möglichkeit wäre es, in einer Schleife den Rest mit 10 zu multiplizieren und durch b zu teilen genau so wie man das mit Papier und Bleistift auch macht.

MfG Peter(TOO)