Xcode / Swift?
Warum kann er bei dem ersten Bild alle Ergebnisse berechnen (mit dem Winkel Beta 53.11, Seite A und Seite B) Aber auf dem zweiten Bild nicht? (mit dem wert 53.4)
Ist wahrscheinlich (wieder mal) ein Mathematisches problem und nicht im Code..?
Und wie koennte man einen UIAlertController anzeigen lassen wenn er NaN raus bekommt? (Bitte keinen fertigen Code schreiben nur einen Vorschlag)
2 Antworten
Offenbar ist das Dreieck gesucht, für das die Seiten c und b sowie der Winkel beta gegeben sind.
Für den ersten Datensatz läßt sich ein solches Dreieck konstruieren. Tatsächlich lassen sich mit den gegebenen Stücken sogar zwei Dreiecke konstruieren, aber das wird im dem Programm wohl nicht berücksichtigt.
Für den zweiten Datensatz gibt es kein Dreieck, weil die Seite b zu kurz ist. Dass die im Programm verwendeten Formeln dann Not-a-Number-Werte liefern, ist interessant.
Um zu verstehen, warum mit den Werten des zweiten Datensatzes kein Dreieck konstruiert werden kann, ist es zweckmäßig, Zirkel und Lineal zur Hand zu nehmen und das Dreieck mit den in der Mittelstufe (bei mir war es in der 8. Klasse dran) gelernten Verfahren zu konstruieren. Die Konstruktionsanweisung lautet:
- Strecke AB mit c = 4 Längeneinheiten zeichnen, Endpunkte mit A und B beschriften.
- Im Punkt B den Winkel beta = 53,4° an die Strecke AB antragen. Es ergibt sich eine Gerade g durch den Punkt B.
- Kreis um A mit Radius b = 3. Die Schnittpunkte des Kreises mit der Gerade g sind genau die möglichen Punkte C des Dreiecks ABC mit den gegebenen Stücken b, c, beta.
Bei der Ausführung des dritten Konstruktionsschritts ist zu beobachten, dass das Dreieck nicht konstruierbar ist, wenn der Kreisradius b zu klein ist. Bei ausreichend großem Radius erhalten wir zwei mögliche Punkte C und C'. Die beiden Dreiecke ABC und ABC' sind in dieser Situation weder kongruent noch ähnlich.
In der Dokumentation zu Swift findet sich diese Seite, die vielleicht weiterhilft:
https://developer.apple.com/documentation/swift/floatingpoint/isnan
Anhand der Bilder kann man das Problem nicht erkennen. NaN heißt Not a Number, es kommt also kein reguläres Ergebnis bei der Berechnung raus.
Das tritt zum Beispiel bei einer Fließkommadivision durch null (die ergibt unendlich) auf:
let x = (42.0 / 0.0) * 0.0 // = NaN
42.0 / 0.0 ist .infinity und 0.0 * .infinity ist NaN
Du musst halt schauen, wo es bei dir zu einer Division durch Null oder zu Unendlich im Code kommt.
Für einen UIAlertController gibt es zig Tutorials. Da du wie ich annehme UIKit verwendete (und nicht wie in meinem Beispiel SwiftUI) hier verschiedene Beispiel für UIKit:
https://medium.com/swift-india/uialertcontroller-in-swift-22f3c5b1dd68
Hey wir kennen uns doch :D Den UIAlertController habe ich schon verwendet, nur wie man den benutzt wenn dort "nan" im textfeld steht weiss ich nicht. Moeglicherweise: wenn irgentein textfeld NaN anzeigt: fehlermeldung
Das hat ja nichts mit deinem Textfeld zu tun, sondern mit deinem Rechnenergebnis. Deine Ergebnisse musst du überprüfen und wenn dort NaN rauskommt, dann zeigst du einen Alert an und schreibst was lesbares (bspw. „undefiniert“) in das TextFeld.
let x = (42.0 / 0.0) * 0.0
if x.isNaN {
showAlertDialog()
}
Natürlich musst du schauen, ob der NaN nicht durch einen Fehler von dir kommt.
Habe schon ueberprueft wann der NaN auftaucht. Nur bei Dreiecken die sowieso nicht moeglich waeren. Danke!
Vielen Dank! Weisst du zufaelligerweise wie man der App mit einer If Abfrage sagt, dass wenn in einer Textbox sich "nan" befindet, einen error anzeigen soll? Den UIAlertController habe ich schon vorbereitet. Sowas wie:
if !(seitea.text?.isNaN)! {
showError()
}
(funktioniert so natuerlich nicht)