<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=us-ascii">
<META content="MSHTML 6.00.2800.1528" name=GENERATOR></HEAD>
<BODY>
<DIV><SPAN class=661553313-13042006><FONT face=Arial size=2>In Haskell, the 
behaviour of functions on floating-point values which are NaN&nbsp;can 
be&nbsp;platform dependent.</FONT></SPAN></DIV>
<DIV><SPAN class=661553313-13042006><FONT face=Arial 
size=2></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=661553313-13042006><FONT face=Arial 
size=2>On&nbsp;"</FONT></SPAN><SPAN class=661553313-13042006><FONT face=Arial 
size=2>SunOS&nbsp;sun 5.9 Generic_118558-09 sun4u sparc 
SUNW,Sun-Blade-1500":<BR></FONT></SPAN><SPAN class=661553313-13042006><FONT 
face=Arial size=2></FONT></SPAN></DIV>
<DIV><SPAN class=661553313-13042006><FONT face=Arial size=2>Prelude&gt; ceiling 
(0/0)<BR>359538626972463141629054847463408713596141135051689993197834953606314521560057077521179117265533756343080917907028764928468642653778928365536935093407075033972099821153102564152490980180778657888151737016910267884609166473806445896331617118664246696549595652408289446337476354361838599762500808052368249716736</FONT></SPAN></DIV>
<DIV><SPAN class=661553313-13042006><FONT face=Arial 
size=2></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=661553313-13042006><FONT face=Arial size=2>On 
Windows:</FONT></SPAN></DIV>
<DIV><SPAN class=661553313-13042006><FONT face=Arial 
size=2></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=661553313-13042006><FONT face=Arial size=2>Prelude&gt; ceiling 
(0/0)<BR>-269653970229347386159395778618353710042696546841345985910145121736599013708251444699062715983611304031680170819807090036488184653221624933739271145959211186566651840137298227914453329401869141179179624428127508653257226023513694322210869665811240855745025766026879447359920868907719574457253034494436336205824</FONT></SPAN></DIV>
<DIV><SPAN class=661553313-13042006><FONT face=Arial 
size=2></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=661553313-13042006><FONT face=Arial size=2>
<DIV><SPAN class=661553313-13042006><FONT face=Arial size=2>Both machines use 
the binary distributions of GHC 6.4.1.</FONT></SPAN></DIV>
<DIV><SPAN class=661553313-13042006></SPAN>&nbsp;</DIV>
<DIV><SPAN class=661553313-13042006>In our production code,&nbsp;this error 
(which is actually an error in&nbsp;our program) occured inside a quite complex 
expression which can be simplified to max 0 (ceiling (0/0)).&nbsp; On Windows, 
we did not recognize the error in the program, because the complex expression 
just returned 0.&nbsp; On Solaris,&nbsp;the complex expression&nbsp;returned 
this large number (which represents in the application "the number of CPUs 
needed in a certain device" ;-)</SPAN></DIV>
<DIV><SPAN class=661553313-13042006></SPAN>&nbsp;</DIV>
<DIV><SPAN class=661553313-13042006>
<DIV><SPAN class=661553313-13042006>We develop Haskell programs on Windows and 
run them in production on Sparc with Solaris. It seems that we have to run 
special regression tests testing for differences between Sparc Solaris and 
Windows.</SPAN></DIV></SPAN></DIV>
<DIV><SPAN class=661553313-13042006></SPAN>&nbsp;</DIV>
<DIV><SPAN class=661553313-13042006>The Haskell 98 report&nbsp;<A 
href="http://www.haskell.org/onlinereport/basic.html#sect6.4">http://www.haskell.org/onlinereport/basic.html#sect6.4</A>&nbsp;states: 
"The results of exceptional conditions (such as overflow or underflow) on the 
fixed-precision numeric types are undefined; an implementation may choose error 
(<I>_|_</I>, semantically), a truncated value, or a special value such as 
infinity, indefinite, etc."</SPAN></DIV>
<DIV><SPAN class=661553313-13042006></SPAN><SPAN 
class=661553313-13042006></SPAN>&nbsp;</DIV>
<DIV><SPAN class=661553313-13042006>There has been some discussion six years ago 
and nearly two years ago: <A 
href="http://blog.gmane.org/gmane.comp.lang.haskell.glasgow.user/month=20040801">http://blog.gmane.org/gmane.comp.lang.haskell.glasgow.user/month=20040801</A></SPAN></DIV>
<DIV><SPAN class=661553313-13042006></SPAN>&nbsp;</DIV>
<DIV><SPAN class=661553313-13042006>Is there a chance to</SPAN></DIV>
<DIV><SPAN class=661553313-13042006>- properly define the behaviour of functions 
depending on the function properFraction for values like NaN, Infinity, 
...?</SPAN></DIV>
<DIV><SPAN class=661553313-13042006>- get an implementation of this in GHC which 
computes the same results for all platforms?</SPAN></DIV>
<DIV><SPAN class=661553313-13042006></SPAN>&nbsp;</DIV>
<DIV><SPAN class=661553313-13042006>Perhaps the function properFraction could 
raise an exception in case of isNaN and isInfinity?</SPAN></DIV>
<DIV><SPAN class=661553313-13042006></SPAN>&nbsp;</DIV>
<DIV><SPAN class=661553313-13042006>Other languages are more portable. E.g., for 
Java, these cases are defined. <A 
href="http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html#9249">http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html#9249</A>&nbsp;states: 
"All numeric operations with NaN as an operand produce NaN as a 
result."</SPAN></DIV>
<DIV><SPAN class=661553313-13042006></SPAN>&nbsp;</DIV>
<DIV><SPAN 
class=661553313-13042006>Tim</SPAN></DIV></FONT></SPAN></DIV></BODY></HTML>