Laden...

float, double zu Bruch

Erstellt von Nopileos vor 16 Jahren Letzter Beitrag vor 16 Jahren 6.878 Views
N
Nopileos Themenstarter:in
68 Beiträge seit 2006
vor 16 Jahren
float, double zu Bruch

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

1.373 Beiträge seit 2004
vor 16 Jahren

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

A
138 Beiträge seit 2007
vor 16 Jahren

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).

345 Beiträge seit 2005
vor 16 Jahren

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

S
1.047 Beiträge seit 2005
vor 16 Jahren
N
Nopileos Themenstarter:in
68 Beiträge seit 2006
vor 16 Jahren

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

C
980 Beiträge seit 2003
vor 16 Jahren

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 😉

N
Nopileos Themenstarter:in
68 Beiträge seit 2006
vor 16 Jahren

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

C
980 Beiträge seit 2003
vor 16 Jahren

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.

179 Beiträge seit 2006
vor 16 Jahren

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

B
1.529 Beiträge seit 2006
vor 16 Jahren

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.