Wieso 'Division by 0 forbidden'

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
Captn. Jinguji
Beiträge: 397
Registriert: 07.06.2005 19:47
Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
Wohnort: Witten

Beitrag von Captn. Jinguji »

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...
Ist das Kunst hier, oder kann das weg ?
Little John

Re: Wieso 'Division by 0 forbidden'

Beitrag von Little John »

Jilocasin hat geschrieben:Moin :)
Hab wiedermal ein .. naja, kein Problem, vielmehr eine Frage:


Ein einzeiliges...

Code: Alles auswählen

Debug StrF(3 / (3/4))
(selbes auch ohne StrF(...) hab ich gerade festgestellt)

Gibt bei mir ein Division by 0 forbidden beim Kompilieren aus :?
Wieso denn das wenn ich mal fragen darf.. ?
Als Ergänzung zu den bisherigen Antworten:

Code: Alles auswählen

Debug StrF(3 / (3.0/4.0))
funktioniert bei mir (PB 4.10 Beta 3 Windows) wie erwartet.
Das Notieren des Dezimalpunktes veranlasst PB offenbar, die betreffenden Zahlen als Fließkommawerte zu behandeln.

Gruß, Little John
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

yo is klar, hatte KG auch schon angedeutet
Kaeru Gaman hat geschrieben:es genügt, wenn eine der zahlen explizit als Float hingeschrieben wird.
my pb stuff..
Bild..jedenfalls war das mal so.
Little John

Beitrag von Little John »

Ooops, sorry. Das hatte ich wohl überlesen.

Gruß, Little John
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

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:

Code: Alles auswählen

{expression}.type

;Example: Cast the expression "57/(3*4)" to a float value
{57/(3*4)}.f
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...
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

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

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

so wäre es logisch, funktioniert aber nicht für

Code: Alles auswählen

PermSin2 = Sin(#PI/ 64 * (counter & 127))
und das finde ich echt zum kotzen...

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