Hmnja,.... der Ton des Norwegers hätte mich auch geärgert.
Ich frage mich gerade, ob die Lösung schlicht darin liegen könnte,
dass Fred zur Compile time erkennt, wenn es sich um einen puren Integerausdruck handelt und den dann gesondert behandelt (nämlich alle promotions rauslässt) - und damit aber erheblich speed in der Run time gewinnt. Anders ist mbMn nicht zu erklären, dass eine beliebige der drei Zahlen dazu führt, dass dann wirklich wie von dem Lappen beschrieben der Funktionstyp zum Casting-Quast über alles wird...
Wieso 'Division by 0 forbidden'
- Captn. Jinguji
- Beiträge: 397
- Registriert: 07.06.2005 19:47
- Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
- Wohnort: Witten
Re: Wieso 'Division by 0 forbidden'
Als Ergänzung zu den bisherigen Antworten:Jilocasin hat geschrieben:Moin
Hab wiedermal ein .. naja, kein Problem, vielmehr eine Frage:
Ein einzeiliges...(selbes auch ohne StrF(...) hab ich gerade festgestellt)Code: Alles auswählen
Debug StrF(3 / (3/4))
Gibt bei mir ein Division by 0 forbidden beim Kompilieren aus![]()
Wieso denn das wenn ich mal fragen darf.. ?
Code: Alles auswählen
Debug StrF(3 / (3.0/4.0))
Das Notieren des Dezimalpunktes veranlasst PB offenbar, die betreffenden Zahlen als Fließkommawerte zu behandeln.
Gruß, Little John
- hardfalcon
- Beiträge: 3447
- Registriert: 29.08.2004 20:46
Es ist doch durchaus denkbar, dass jemand bei so einem Ausdruck nur das Ergebnis der Ausdrucks als Float behandelt haben möchte, die einzelnen Operanden jedoch z.B. aus Gründen der Genauigkeit als Integer behandelt haben möchte. IMHO fehlt da ganz schlicht ne möglichkeit, um ganz explizit ein Typecasting vorzunehmen ohne den Umweg über eine Variable nehmen zu müssen. Aus meiner Sicht erschiene mir ganz spontan z.B. folgendes Konstrukt (den zu castenden Ausdruck zwischen geschweiften Klammern, die vom Suffix für den gewünschen Datentyp gefolgt sind) recht sinnvoll:
Vielleicht sollte mal jemand Fred nen entsprechenden Vorschlag unterbreiten, ich selber werde sowas nicht tun, weil ich 1. kaum noch programmiere und 2. nicht soviel Erfahrung auf diesem Gebiet habe wie einige andere Forenmitglieder hier (z.B. freak, Kaeru Gaman, bobobo, um nur einige zu nennen).
//EDIT: Vielleicht wären aus Gründen der Lesbarkeit auch eckige Klammern besser geeignet (ab Schriftgrösse 10 und abwärts sind je nach Schriftart geschweifte von runden Klammern kaum noch zu unterscheiden), soweit ich sehe sollte man ja eigentlich jeden der 3 Klammerntypen verwenden können, ohne an der bestehenden PB-Syntax etwas ändern zu müssen...
Code: Alles auswählen
{expression}.type
;Example: Cast the expression "57/(3*4)" to a float value
{57/(3*4)}.f
//EDIT: Vielleicht wären aus Gründen der Lesbarkeit auch eckige Klammern besser geeignet (ab Schriftgrösse 10 und abwärts sind je nach Schriftart geschweifte von runden Klammern kaum noch zu unterscheiden), soweit ich sehe sollte man ja eigentlich jeden der 3 Klammerntypen verwenden können, ohne an der bestehenden PB-Syntax etwas ändern zu müssen...
Ist aber schon in Ordnung so, wie das abläuft. In anderen Programmiersprachen wäre es genau gleich - der Ausdruck wird erstmal komplett ausgewertet und gibt dann einen Wert zurück. Dieser Rückgabewert wird dann erst in die Funktion eingesetzt, das ist ja ein Aufruf - der Wert wird also auf den Stack gepusht. Und wenn die Funktion das dann auf 'nen anderen Typ castet, geschieht das erst, wenn der eigentliche Wert schon längst ausgerechnet wurde.


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
so wäre es logisch, funktioniert aber nicht für
und das finde ich echt zum kotzen...
...wenn mein rechner wieder läuft, sollte ich wohl doch mal wieder C++ installieren...
Code: Alles auswählen
PermSin2 = Sin(#PI/ 64 * (counter & 127))
...wenn mein rechner wieder läuft, sollte ich wohl doch mal wieder C++ installieren...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.