<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">On 10/27/2014 12:00 PM,
      <a class="moz-txt-link-abbreviated" href="mailto:users-request@racket-lang.org">users-request@racket-lang.org</a> wrote:<br>
    </div>
    <blockquote
      cite="mid:mailman.3.1414425603.11374.users@racket-lang.org"
      type="cite">
      <pre wrap="">Re: [racket] Nice article on scientific computing in Racket</pre>
    </blockquote>
    Nice article.  Some comments:<br>
    <br>
    1.  I don't have a login on hacker news, but someone should downvote
    the first  comment!  (You actually show in your Figure 4(b) that the
    comment is incorrect.)<br>
    <br>
    2.  In the example on page 94, I think the last two statements are a
    bit misleading:<br>
    <br>
    <blockquote>Racket’s math library exports functions that operate on<br>
      double-doubles. Those that only return double-doubles have<br>
      the suffix /error (read “with error”). For example,<br>
      > (fl*/error 1.1 2.1)<br>
      2.3100000000000005<br>
      -2.1316282072803005e-16<br>
      The exact sum (not the floating-point sum) of these<br>
      returned float values is the exact product of 1.1 and 2.1 .<br>
      Alternatively, the first float value is an approximation, and<br>
      the second is its signed rounding error.<br>
    </blockquote>
    <br>
    There is no way to represent "the exact product of 1.1 and 2.1" in
    base 2 floating-point arithmetic; what's being returned is "the
    exact product of the closest floating-point approximations to 1.1
    and 2.1 in base 2 floating-point arithmetic".  E.g:<br>
    <br>
    <blockquote>heine:~/text/courses/computation/computational-reals/src>
      gsc<br>
      Gambit v4.7.3<br>
      <br>
      > (load "exact-reals")           <br>
"/home/lucier/text/courses/computation/computational-reals/src/exact-reals.o2"<br>
      > (define a (->computable #e1.1))<br>
      > (define b (->computable #e2.1))<br>
      > (define x (computable-* a b))<br>
      > (define x1 (computable->inexact x))<br>
      > (define x2 (computable->inexact (computable-- x
      (->computable x1))))<br>
      > (define x3 (computable->inexact (computable-- x
      (computable-+ (->computable x1) (->computable x2)))))<br>
      > x1<br>
      2.31<br>
      > x2<br>
      -5.329070518200751e-17<br>
      > x3<br>
      -1.9721522630525296e-33<br>
      > (define a (->computable 1.1))<br>
      > (define b (->computable 2.1))<br>
      > (define x (computable-* a b))<br>
      > (define x1 (computable->inexact x))<br>
      > (define x2 (computable->inexact (computable-- x
      (->computable x1))))<br>
      > (define x3 (computable->inexact (computable-- x
      (computable-+ (->computable x1) (->computable x2)))))<br>
      *** INTERRUPTED IN ##bignum.div<br>
      1> <br>
      > x1<br>
      2.3100000000000005<br>
      > x2<br>
      -2.1316282072803005e-16<br>
    </blockquote>
    <br>
    I sometimes forget that certain things are not decidable in the
    computational reals, but after sitting for 20 seconds or so when the
    program was trying to compute x3 the second time, I remembered that
    converting to inexact an exact zero or a number with rounding error
    exactly 1/2 ulp is undecidable, and that was evidenced very
    concretely by the program going into an infinite loop, which I had
    to interrupt.<br>
    <br>
    3.  I like that you argue that:<br>
    <br>
    <blockquote>Second, so much other code usually surrounds floating-<br>
      point computations—for example, code that shuffles data<br>
      around, indexes arrays, or decides what to compute—that<br>
      taking even a fourfold speed hit hardly matters.<br>
    </blockquote>
    <br>
    In other words, I agree with you, but I don't think that this
    hypothesis is shared by the High Performance Computing community.<br>
    <br>
    Again, nice article.<br>
    <br>
    Brad<br>
  </body>
</html>