Pas2JS: Fehler in der Math beim Potenzieren mit "**"

Antworten
Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 334
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Pas2JS: Fehler in der Math beim Potenzieren mit "**"

Beitrag von Niesi »

Da ist ein Fehler in der Pas2JS Math (ich nehme an, es ist in der Math - zumindest ist beim "normalen" FreePascal / Lazarus das Potenzieren mittels ** in der Math definiert):

Beim Potenzieren mit "**" wird erst multipliziert und dann potenziert. Das ist falsch. Und auch ziemlich schlimm (zumindest für mich).

Im "Normalen" Lazarus / FreePascal ist es richtig.

Ich melde den Bug mal ...

Bildschirmfoto vom 2024-01-21 14-15-36.png
Bildschirmfoto vom 2024-01-21 14-15-36.png (17.54 KiB) 2480 mal betrachtet

Code: Alles auswählen

procedure TWForm1.CalcIt;
begin
  Ergebnis1.Value := Basis1.Value ** Potenz1.Value;
  Ergebnis2.Value := Multiplikator2.Value * Basis2.Value ** Poten2.Value;
  Ergebnis3.Value := Basis3.Value ** Potenz3.Value;
  Ergebnis4.Value := Ergebnis3.Value * Multiplikator3.Value;
  Ergebnis5.Value := Multiplikator4.Value * Power(Basis4.Value, Potenz4.Value);
end;
Pas2JS_Potenzproblem.7z
(64.33 KiB) 31-mal heruntergeladen
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Pas2JS: Fehler in der Math beim Potenzieren mit "**"

Beitrag von Mathias »

Wen ich folgendes mit pas2js mache, kommt das Ergebnis wie erwartet.

Code: Alles auswählen

var
  a, b, c: double;
begin
  a := 10;
  b := 3;
  c := a ** b;  // 1000
  Writeln(c);

  a := 3;
  b := 4;
  c := a ** b; // 81
  Writeln(c);      
Oder habe ich etwas übersehen ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Pas2JS: Fehler in der Math beim Potenzieren mit "**"

Beitrag von wp_xyz »

Ich denke auch, dass es ein Fehler ist, wenn in einem Ausdruck a * b ** c zuerst multipliziert und dann erst potenziert wird (das ist doch das Problem, oder?), denn allgemein hat die Potenz eine höhere Priorität als die Multiplikation. Dennoch kann es nicht schaden hier Klammern zu setzen (a * (b ** c), oder (a * b) ** c), denn manchmal kann es unerwartete Probleme geben. Ich denke da an eine Diskussion im englischen Forum, ob in dem Ausdruck x := -2**2 das Ergebnis 4 ist oder -4. Wird da die Zahl (-2) quadriert, oder das Quadrat von 2 negiert? Oder anders gedrückt: hat der Potenzoperator eine höhere Priorität als der unäre Minus-Operator? Daher setze ich zur Vorsicht Klammern: (-2)**2 oder -(2**2).

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Pas2JS: Fehler in der Math beim Potenzieren mit "**"

Beitrag von Mathias »

Jetzt sehe ich da Problem auch, er meinte es wie bei der Punkt/Strich Priorität.

Bei normalen FPC ist ** in der Unit Math deklariert, ohne uses Math wird es gar nicht erkannt.
Bei pas2js ist es woanders deklariert, nur kann ich es nicht finden wo, auch nicht in der unit system.

Könnte es sein, das es direkt im Compiler von pas2js ist, so wie es bei den normalen Operatoren auch der Fall ist ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 334
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Pas2JS: Fehler in der Math beim Potenzieren mit "**"

Beitrag von Niesi »

wp_xyz hat geschrieben:
So 21. Jan 2024, 16:21
Ich denke auch, dass es ein Fehler ist, wenn in einem Ausdruck a * b ** c zuerst multipliziert und dann erst potenziert wird (das ist doch das Problem, oder?), denn allgemein hat die Potenz eine höhere Priorität als die Multiplikation. Dennoch kann es nicht schaden hier Klammern zu setzen (a * (b ** c), oder (a * b) ** c), denn manchmal kann es unerwartete Probleme geben. Ich denke da an eine Diskussion im englischen Forum, ob in dem Ausdruck x := -2**2 das Ergebnis 4 ist oder -4. Wird da die Zahl (-2) quadriert, oder das Quadrat von 2 negiert? Oder anders gedrückt: hat der Potenzoperator eine höhere Priorität als der unäre Minus-Operator? Daher setze ich zur Vorsicht Klammern: (-2)**2 oder -(2**2).
Absolut korrekt: es ist erst zu potenzieren und dann zu multiplizieren.

Du hast Recht mit den Klammern: damit funktioniert es . Da bin ich gar nicht drauf gekommen - vermutlich, weil mein eigentlicher Quellcode deutlich umfangreichere Zeilen enthält als das Beispiel von mir. Ich ziehe meine Units von der "Standardentwicklung" rüber zu Pas2JS. Und dann kamen halt andere Resultate. War eine recht lange Suche, bis ich drauf kam ...

Bildschirmfoto vom 2024-01-22 10-54-32.png
Bildschirmfoto vom 2024-01-22 10-54-32.png (9.15 KiB) 2435 mal betrachtet
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Pas2JS: Fehler in der Math beim Potenzieren mit "**"

Beitrag von Mathias »

Absolut korrekt: es ist erst zu potenzieren und dann zu multiplizieren.
Da FPC eine Operatorenüberlagerung bei den ** macht, wird das Priorität haben, was in FPC vorbestimmt ist.
Ob die Überlagerungen oder die Standard Operatoren Vorrang haben, kann ich nicht sagen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 830
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Pas2JS: Fehler in der Math beim Potenzieren mit "**"

Beitrag von PascalDragon »

Mathias hat geschrieben:
Mo 22. Jan 2024, 19:55
Absolut korrekt: es ist erst zu potenzieren und dann zu multiplizieren.
Da FPC eine Operatorenüberlagerung bei den ** macht, wird das Priorität haben, was in FPC vorbestimmt ist.
Ob die Überlagerungen oder die Standard Operatoren Vorrang haben, kann ich nicht sagen.
Die Vorrangreihenfolge der Operatoren ist unabhängig davon, ob sie eingebaut sind oder durch Operatorenüberladung definiert sind. Potenzierung ist immer vor Multiplikation ist immer vor Addition. Wenn das bei pas2js nicht so ist, dann ist es ein Bug.
FPC Compiler Entwickler

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Pas2JS: Fehler in der Math beim Potenzieren mit "**"

Beitrag von Mathias »

Anscheinend wird der Bug zu herzen genommen.

https://wiki.freepascal.org/Pas2JS_Vers ... xt_Version
Fixed precedence multiply and power: 100 * 9 ** 0.5 results in 100 * (9 ** 0.5)
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 334
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Pas2JS: Fehler in der Math beim Potenzieren mit "**"

Beitrag von Niesi »

Mathias hat geschrieben:
Mi 28. Feb 2024, 16:05
Anscheinend wird der Bug zu herzen genommen.

https://wiki.freepascal.org/Pas2JS_Vers ... xt_Version
Fixed precedence multiply and power: 100 * 9 ** 0.5 results in 100 * (9 ** 0.5)
Der Bug hatte es auch in sich - da war die Grundlage von allem nicht korrekt angewandt: die Mathematik ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Antworten