chr_engelmann2001 - So 26.01.03 12:32
Titel: Case-Anweisung mit Real-Typen
Ich will in einer case-Anweisung Var´s vom Typ real behandeln.
Zum Beispiel:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| var a: Real; begin ... case a of 1.2..3.5: ... 7.4..50.23: ... end; |
Wie kann ich das realisieren?
Moderiert von
Tino: Code-Tags hinzugefügt.
Delete - So 26.01.03 12:58
Geht nicht.
case arbeitet nur mit Ganzahl-Typen, bzw. Typen die einen eindeutigen Vorgänger und Nachfolger haben also enumerierbar sind und das sind nur Integers.
Was wäre denn der Nachfolger von 1,2? 1,3 oder 1,25?
Zitat: |
where selectorExpression is any expression of an ordinal type (string types are invalid) and each caseList is one of the following:
- A numeral, declared constant, or other expression that the compiler can evaluate without executing your program. It must be of an ordinal type compatible with selectorExpression. Thus 7, True, 4 + 5 * 3, 'A', and Integer('A') can all be used as caseLists, but variables and most function calls cannot. (A few built-in functions like Hi and Lo can occur in a caseList. See Constant expressions.)
- A subrange having the form First..Last, where First and Last both satisfy the criterion above and First is less than or equal to Last.
- A list having the form item1, ..., itemn, where each item satisfies one of the criteria above.
|
Brueggendiek - So 26.01.03 12:58
Hallo!
Das geht leider nicht. Bei Case sind nur ganzzahlige Werte erlaubt.
Es muß so programmiert werden:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| if (a>=1.2) and (a<=3.5) then begin ... end else if (a>=7.4) and (a<=50.23) then begin ... end; |
Noch ein Hinweis: Real-Typen vergleicht man möglichst nicht mit '='! Grund dafür ist, daß Real intern in Exponentendarstellung gespeichert werden. Dadurch können die Zahlen sehr groß werden, aber die Zahl der gültigen Stellen ist begrenzt.
Stark vereinfacht auf dezimale Zahlen übertragen:
Es werden 3 Ziffern und die Position des Kommas gespeichert. Möglich ist:
0,000000000000123
123
12300000000000000
aber:
123900 ist nicht darstellbar und wird als 123000 gespeichert.
Alte Programmiereregel: vor dem Addieren einer Folge von Real-Zahlen sortieren und von unten nach oben addieren!
Zähle im obigen Zahlenbeistiel zu 999 1000 mal die 1 zu - Ergebnis:
1: 999+1=1000
2: 1000 + 1 = 100
0, weil nur 3 Ziffern bearbeitet werden!
Ergebnis: 1000
alternativ:
1000*1=1000
999+1000=1990 - kommt dem Ergebnis schon näher!
Wenn es vom Zahlenbereich hinkommt, sollte man Festkoma-Zahlen nehmen. Wer hindert mich z.B. daran, einen Int64 grundsätzlich als mit 4 Nachkommastellen versehen zu betrachten - nur eine Frage der Formatierung bei der Ausgabe!
Gruß
Dietmar Brüggendiek