floating point -> rational number
-
Hallo Leute, wie könnte man das lösen?
ggT(a, b) { if (b == 0) { return a; } return this.ggT(b, a % b); } print(fractional = false) { for (let i = 0; i < this.rows; i++) { let s = ""; for (let j = 0; j < this.cols; j++) { let v = this.matrix[i][j]; if (fractional && v != 0 && v != 1) { let a = parseInt(v * 100.0); let b = 100; let ggt = this.ggT(a, b); s += (a / ggt) + "/" + (b / ggt) + " "; } else { s += Number(v).toFixed(2) + " "; } } this.appendMessage(s); } this.appendMessage(""); }Die Ausgabe soll einmal eine Dezimalzahl (x.yy) und einmal eine Bruchzahl (xx/yy) sein.
Zurzeit berechne ich alles mit floating points... die Ausgabe wird dann gekürzt auf zwei Nachkommastellen.
Bei 2/3 tritt allerdings ein Problem auf:
3.00 2.00 1.00 0.67 1.00 33/50Hättet ihr einen Lösungsvorschlag? ... Ich weiß, dass in Computersystemen... floating points nur mit endlicher Genauigkeit dargestellt werden können, aber 33/50 sind eben nicht 2/3 (Fehler: 1 %).
-
Das hat sich schon gelöst... Ich hatte einen Denkfehler, denn nicht alle reelle Zahlen lassen sich "schön" in der Form xx/yy als reine rationale Zahlen darstellen... das ist auch logisch, weil die Menge der reellen Zahlen ja größer ist... (ok, beide sind unendlich, aber darum geht's mir nicht).
Oder mathematischer, selbst, wenn man die Urbildmenge auf [-99.99,+99.99] begrenzen würde und die Bildmenge auf alle Zahlen in der Form (-)xx/yy, wäre die Injektivität, Surjektivität und Bidirektionalität nicht mehr gegeben.
Oder einfacher, 10/2 könnte sowohl 5.0 als auch 4.99 gewesen sein (da 499/100 nicht mehr in der Form xx/yy wäre).