Gibt es eine Zahl mit der multipliziert ein float oder ein double immer eine ganze Zahl wird?
dann könnte man nämlich ein double zu einem Bruch machen indem man das (oder den 🤔 ) double mit der Zahl multipliziert das als Zähler nimmt und dann die Zahl als Nenner.
Ich such noch mal ein projekt wo ich mich im Bereich KI üben kann
Hallo,
Wenn man eine Dezimalzahl (außer 0) mit ihrem Kehrwert (1 geteilt durch diese Zahl) multipliziert, ist das Resultat eine ganze Zahl - nämlich 1.
Damit ist dir aber nicht geholfen, da der Kehrwert keineswegs ganzzahlig sein muss. Eine google-Suche nach "Dezimalzahl zu Bruch" dürfte dir interessante Informationen bringen.
Viele Grüße,
Andre
Hallo,
eine Möglichkeit wäre, die Zahl solange mit 10 zu multipilizieren, bis diese keinen Nachkommaanteil mehr hat.
In etwa so:
int i=0;
double x = 0.1234;
while( (long)x != x)
{
x *= 10;
i++;
}
long zaehler = (long)x; // =1234
long nenner = Math.Pow(10,i); // = 10000
(Evt. kann man auch schneller die Länge des Nachkommaanteils ermitteln und dann mit 10^x multiplizieren)
Anschließend kann man den größten gemeinsamten Teiler ermitteln (per euklidschen Algorithmus) und beide Zahlen dadurch teilen (Bruch kürzt man damit).
Das kann dann aber nur eine Näherung sein.
Sowas ganz profanes, wie etwa 2/7 wird da nicht wieder als 2/7 rauskommen
(womit ich nicht behaupten will, ich hätte ne bessere Methode in Petto)
Mein Haus, mein Viertel, mein Blog
ich hatte da mehr so dran gedacht den double (oder float) mit seinem maximalen Wertebereich + 1 zu multiplizieren
da dann selbst wenn der hex 0000000000000001 ist und dann mit 10000000000000000 multipliziert wird kommt da 10000000000000000 raus also eine ganze Zahl nur leider entsteht dabei ein Überlauf.
Ich such noch mal ein projekt wo ich mich im Bereich KI üben kann
Original von Nopileos
ich hatte da mehr so dran gedacht den double (oder float) mit seinem maximalen Wertebereich + 1 zu multiplizieren
da dann selbst wenn der hex 0000000000000001 ist und dann mit 10000000000000000 multipliziert wird kommt da 10000000000000000 raus also eine ganze Zahl nur leider entsteht dabei ein Überlauf.
Der Unterschied zwischen der kleinsten und grössten darstellbaren Zahl eines double beträgt mehr als 600 Stellen. Dürfte also schwierig werden 😉
das wirft bei mir die frage der funktionsweise eines doubles auf
kann man das irgendwo nachlesen? 600 stellen auf 8 Byte ist ne Leistung
Ich such noch mal ein projekt wo ich mich im Bereich KI üben kann
Es werden natürlich nicht 600 Stellen gespeichert. Aber die grösste darstellbare Zahl hat 308 Stellen vor dem Komma, die kleinste 324 Stellen nach dem Komma, macht insgesammt eine Differenz von mehr als 600 Stellen.
Btw, die Differenz der grössten darstellbaren Zahl und der zweitgrössten darstellbaren Zahl hat 292 Stellen vor dem Komma 😉
Mehr dazu giebt's z.b. bei Wikipedia.
Original von Nopileos
das wirft bei mir die frage der funktionsweise eines doubles auf
kann man das irgendwo nachlesen? 600 stellen auf 8 Byte ist ne Leistung
Hi,
Das Zauberwort heißt fließkommadarstellung:
Hier am Beispiel Float:
seeeeeeeeemmmmmmmmmmmmmmmmmmmmmmm
s... Sign
e... Exponent
m... Martisse
Daraus ergibt sich
Val = (Sign ? -1 : 1) * 2^Exponent * 1,Martisse
Genau daraus ergeben sich auch die Probleme beim Rechnen mit floats / doubles, z.B.: beim Addieren einer sehr kleinen mit sehr großen Zahl
mfg dechavue
Wenn du der Genauigkeit wegen mit Brüchen rechnen willst, bringt dir die Umwandlung nichts, da sie eh (meist) ungenau sein wird. In diesem Fall, solltest du konsequent von Eingabe bis Ausgabe mit Brüchen arbeiten. Dazu benötigst du aber eigene Klassen.
Ich habe mal eine auf long-basierende Klasse für Brüche geschrieben. Da diese auf dem von mir hier schon mal geposteten Primzahlengenerator aufsetzt, ist der eigentliche Code für die Brüche sehr kompakt.
Falls es dir etwas hilft, hänge ich den Code mal an.
Da ich ihn für das ursprüngliche Projekt nicht mehr benötige, habe ich auch nicht weiter an den Einschränkungen gearbeitet.