<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'><div dir='ltr'>
Can you isolate if the problem is the formating/printing, or if it is in the computation?<br>i.e.:<br><br>Use "unsafe" and print out a little hex dump of the integer/longint variables?<br><br>As well, what does LONGINT on a 64bit machine do? Eh..well, it might work, it might not.<br>Doesn't really matter. Let's focus on non-working 32bit machine with LONGINT.<br><br>Also, please confirm which is the right, i.e. by writing it in C.<br>Also, maybe just try to format as unsigned/hex using the safe interfaces?<br>Also, this will be good to add to our automated tests. Assuming it doesn't run too slowly.<br>Assuming it reproduces for anyone else (sorry, a bit rude of me).<br><br>Later, thank you,<br> - Jay<br><br><br><div><hr id="stopSpelling">Date: Thu, 14 Jul 2011 16:26:05 -0500<br>From: kcdurocher@gmail.com<br>To: m3devel@elegosoft.com<br>Subject: [M3devel] LONGINT problem?<br><br>I was writing a program to calculate "Pythagorean triples" recursively, and ran into a problem.  Here's the program:<div><br></div><div><div>MODULE PyTriples EXPORTS Main;</div><div><br></div><div>IMPORT IO, Fmt;</div>
<div><br></div><div>VAR tcnt, pcnt, max, i: LONGINT;</div><div><br></div><div>PROCEDURE NewTriangle(a, b, c: LONGINT; VAR tcount, pcount: LONGINT) =</div><div>  VAR perim := a + b + c;      </div><div>  BEGIN</div><div>    IF perim <= max THEN</div>
<div>      pcount := pcount + 1L;</div><div>      tcount := tcount + max DIV perim;</div><div>      NewTriangle(a-2L*b+2L*c, 2L*a-b+2L*c, 2L*a-2L*b+3L*c, tcount, pcount);</div><div>      NewTriangle(a+2L*b+2L*c, 2L*a+b+2L*c, 2L*a+2L*b+3L*c, tcount, pcount);</div>
<div>      NewTriangle(2L*b+2L*c-a, b+2L*c-2L*a, 2L*b+3L*c-2L*a, tcount, pcount);</div><div>    END;</div><div>  END NewTriangle;</div><div><br></div><div>BEGIN</div><div>i := 100L;</div><div><br></div><div>REPEAT</div><div>
  max := i;</div><div>  tcnt := 0L;</div><div>  pcnt := 0L;</div><div>  NewTriangle(3L, 4L, 5L, tcnt, pcnt);</div><div>  IO.Put(Fmt.LongInt(i) & ": " & Fmt.LongInt(tcnt) & " Triples, " &</div>
<div>    Fmt.LongInt(pcnt) & " Primitives\n");</div><div>  i := i * 10L;</div><div>UNTIL i = 10000000L;</div><div><br></div><div>END PyTriples.</div></div><div><br></div><div>This outputs:</div><div><br></div>
<div><div>100: 17 Triples, 7 Primitives</div><div>1000: 325 Triples, 70 Primitives</div><div>10000: 0858 Triples, 703 Primitives</div><div>100000: 40701 Triples, 7024 Primitives</div><div>1000000: 808950 Triples, 70229 Primitives</div>
</div><div><br></div><div>However, if I just use INTEGER on a 64 bit machine, I get the proper output:</div><div><br></div><div><div>100: 17 Triples, 7 Primitives</div><div>1000: 325 Triples, 70 Primitives</div><div>10000: 4858 Triples, 703 Primitives</div>
<div>100000: 64741 Triples, 7026 Primitives</div><div>1000000: 808950 Triples, 70229 Primitives</div></div><div><br></div><div>Note how 10000 and 100000 are different. The code is literally exactly the same, only with LONGINT replaced by INTEGER.</div>
<div><br></div></div>                                     </div></body>
</html>