<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Aptos;
        panose-1:2 11 0 4 2 2 2 2 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:12.0pt;
        font-family:"Aptos",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.E-MailFormatvorlage19
        {mso-style-type:personal-reply;
        font-family:"Aptos",sans-serif;
        color:windowtext;}
MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body lang=DE-CH link=blue vlink=purple style='word-wrap:break-word'><div class=WordSection1><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>Hi all<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>I think I found the error in PdW’s emulator:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>The Verlog line in FPAdder.v<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'>    xn ? (u|yn ? 0 : y) : <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>got translated in fp_add() to<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'> } else if (xn) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>    return (u | yn) ? 0 : y;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>but should be<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>  } else if (xn) {<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>    return (u || yn) ? 0 : y;<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>br<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>Jörg<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'><o:p> </o:p></span></p><div id=mail-editor-reference-message-container><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal style='margin-bottom:12.0pt'><b><span style='color:black'>Von: </span></b><span style='color:black'>Oberon <oberon-bounces@lists.inf.ethz.ch> im Auftrag von Jörg Straube <joerg.straube@iaeth.ch><br><b>Datum: </b>Donnerstag, 11. Juli 2024 um 19:39<br><b>An: </b>ETH Oberon and related systems <oberon@lists.inf.ethz.ch><br><b>Betreff: </b>Re: [Oberon] Fighting a dragon ...<o:p></o:p></span></p></div><p class=MsoNormal><span style='font-size:11.0pt;mso-fareast-language:EN-US'>Hans</span><o:p></o:p></p><p class=MsoNormal><span style='font-size:110pt;mso-fareast-language:EN-US'> </span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>I compiled your source in my environment (Oberon V5 on Mac) and both versions give the same result.</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>My compiler is not exactly the same as yours (I made some add-on to it), but this code is not using my add-ons.</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>So, I don’t think the compiler is the culprit.</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>My RISC emulator is different than yours. Hence, I could imagine the emulator you are using is doing strange things under certain conditions. From the screenshots you provided I assume you are using Peter de Wachter’s emulator.</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'> </span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>I have the gut feeling something might be wrong with the implementation of FLT().</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>Later, I will have a closer at PdW’s risc_fp.c to see whether I can spot an error.</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'> </span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>br</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'>Jörg</span><o:p></o:p></p><p class=MsoNormal><span lang=EN-US style='font-size:11.0pt;mso-fareast-language:EN-US'> </span><o:p></o:p></p><p class=MsoNormal style='margin-bottom:12.0pt'>Am 11.07.24, 18:41 schrieb "Oberon" <oberon-bounces@lists.inf.ethz.ch>:<o:p></o:p></p><div><p class=MsoNormal>Hi all,<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>The dragon curve is an interesting space filling curve that you can approximate by endlessly folding a slip of paper. Apparently I'm not the only one who is fascinated by it; Don Knuth has one decorating a wall in his home: <a href="https://www.youtube.com/watch?v=v678Em6qyzk">https://www.youtube.com/watch?v=v678Em6qyzk</a> (and yes, it has a bug).<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>When making a program to draw dragon curves of different orders for Oberon V5 (Project Oberon 2013) I noticed that odd order dragons look well and healthy but even order dragons degrade into shapeless worms (see the two screenprints on my github page for dragons of order 9 and 10).<o:p></o:p></p></div><div><p class=MsoNormal>The same algorithm in BASIC and Python produces nice dragons of all orders, albeit MUCH slower that my Project Oberon version.<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>For the source files and screenprints see: <o:p></o:p></p></div><div><p class=MsoNormal><a href="https://github.com/hansklav/Fractals-in-Oberon-07/tree/main/Dragon-curves">https://github.com/hansklav/Fractals-in-Oberon-07/tree/main/Dragon-curves</a><o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>First I suspected that a difference between Oberon's MOD operator versus BASIC's MOD and Python's % operators was the culprit, so I made a function REM to mimic them, but that had no effect.<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>Then I pinpointed a problem in the way the Oberon V5 compiler handles an expression for certain values of its variables in my code. Please run the following two commands in Oberon V5, and behold that they unexpectedly give different results: <o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>MODULE TestDragon;   (* hk 11 July 2024 *)<o:p></o:p></p></div><div><p class=MsoNormal>  IMPORT Math, Out;  <o:p></o:p></p></div><div><p class=MsoNormal>  (* For Math.power see: <a href="https://github.com/hansklav/Oberon-07/blob/master/Math.Mod">https://github.com/hansklav/Oberon-07/blob/master/Math.Mod</a> *)<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>  CONST<o:p></o:p></p></div><div><p class=MsoNormal>    pi = 3.1415926535;<o:p></o:p></p></div><div><p class=MsoNormal>    p = 4.0;  (* order of dragon curve *)<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>  PROCEDURE Correct*;  (* TestDragon.Correct *)   (* correct result for x2 *)<o:p></o:p></p></div><div><p class=MsoNormal>    VAR h, x1, x2: REAL;  s: INTEGER;<o:p></o:p></p></div><div><p class=MsoNormal>  BEGIN<o:p></o:p></p></div><div><p class=MsoNormal>    s := 0;  x1 := 7.499998E-01;<o:p></o:p></p></div><div><p class=MsoNormal>    h := 2.500000E-01;<o:p></o:p></p></div><div><p class=MsoNormal>    OutString("s  = "); Out.Int(s, 2); Out.String("    h ="); Out.Real(h, 14); Out.Ln;<o:p></o:p></p></div><div><p class=MsoNormal>    x2 := x1 + h * Math.cos( (FLT(s) - p/2.0) * pi/2.0 );  (* <-- expression tested *)<o:p></o:p></p></div><div><p class=MsoNormal>    Out.String("x1 ="); Out.Real(x1, 14); Out.Ln;<o:p></o:p></p></div><div><p class=MsoNormal>    OutString("x2 ="); Out.Real(x2, 14); Out.Ln;<o:p></o:p></p></div><div><p class=MsoNormal>    Out.Ln<o:p></o:p></p></div><div><p class=MsoNormal>  END Correct;<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>  PROCEDURE Incorrect*;  (* TestDragon.Incorrect *)   (* incorrect result for x2 *)<o:p></o:p></p></div><div><p class=MsoNormal>    VAR h, x1, x2: REAL;  s: INTEGER;<o:p></o:p></p></div><div><p class=MsoNormal>  BEGIN<o:p></o:p></p></div><div><p class=MsoNormal>    s := 0;  x1 := 7.499998E-01;<o:p></o:p></p></div><div><p class=MsoNormal>    h := Math.power(2.0, -p/2.0);  (* the result for h from Math.power() is correct: *)<o:p></o:p></p></div><div><p class=MsoNormal>    Out.String("s  = "); Out.Int(s, 2); Out.String("    h ="); Out.Real(h, 14); Out.Ln;<o:p></o:p></p></div><div><p class=MsoNormal>    x2 := x1 + h * Math.cos( (FLT(s) - p/2.0) * pi/2.0 );  (* <-- why incorrect result?? *)<o:p></o:p></p></div><div><p class=MsoNormal>    Out.String("x1 ="); Out.Real(x1, 14); Out.Ln;<o:p></o:p></p></div><div><p class=MsoNormal>    Out.String("x2 ="); Out.Real(x2, 14); Out.Ln;<o:p></o:p></p></div><div><p class=MsoNormal>    Out.Ln<o:p></o:p></p></div><div><p class=MsoNormal>  END Incorrect;<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>END TestDragon.<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>The first command gives the correct result (0.4999998), which can easily be verified by pasting the following line in <a href="https://www.wolframalpha.com/">https://wwwwolframalpha.com/</a> :<o:p></o:p></p></div><div><p class=MsoNormal>  7.499998E-01 + 2.500000E-01 * cos((0 - 4/2) * pi/2.0)<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>But why the same expression in the second command gives a wrong result (0.6249998) for the same values of its variables as the first command escapes me.<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>Could anyone give an explanation??<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>Because I cannot reproduce this incorrect behaviour using the OBNC compiler, I suspect a compiler error.<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>Regards,<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>Hans Klaver<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><div><p class=MsoNormal>--<o:p></o:p></p></div><div><p class=MsoNormal><a href="mailto:Oberon@lists.inf.ethz.ch">Oberon@lists.inf.ethz.ch</a> mailing list for ETH Oberon and related systems<o:p></o:p></p></div><div><p class=MsoNormal><a href="https://lists.inf.ethz.ch/mailman/listinfo/oberon">https://lists.inf.ethz.ch/mailman/listinfo/oberon</a><o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div></div></div></div></body></html>