Recursively integrate after substitution.
authorTaylor R Campbell <campbell@mumble.net>
Sat, 1 Dec 2018 15:16:49 +0000 (15:16 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Sat, 1 Dec 2018 15:16:49 +0000 (15:16 +0000)
The declarations in this context may have changed.  This way, you can
get a lot of straight-line floating-point arithmetic like so:

(define (flo:sinh-taylor19 x)
  (declare (no-type-checks))
  (let* ((x^2 (flo:* x x))
         (t8 (flo:/ 1. 121645100408832000.))
         (t7 (flo:+ (flo:/ 1. 355687428096000.) (flo:* x^2 t8)))
         (t6 (flo:+ (flo:/ 1. 1307674368000.) (flo:* x^2 t7)))
         (t5 (flo:+ (flo:/ 1. 6227020800.) (flo:* x^2 t6)))
         (t4 (flo:+ (flo:/ 1. 39916800.) (flo:* x^2 t5)))
         (t3 (flo:+ (flo:/ 1. 362880.) (flo:* x^2 t4)))
         (t2 (flo:+ (flo:/ 1. 5040.) (flo:* x^2 t3)))
         (t1 (flo:+ (flo:/ 1. 120.) (flo:* x^2 t2)))
         (t0 (flo:+ (flo:/ 1. 6.) (flo:* x^2 t1))))
    (declare (integrate t0 t1 t2 t3 t4 t5 t6 t7 t8 x^2))
    (flo:* x (flo:+ 1. (flo:* x^2 t0)))))

Previously, the number of variables in this sequence that would be
integrated depended on the number of surrounding integrated calls in
the body of the let (!).

src/sf/subst.scm

index cb4233a552e99b61c138962152e8dce34fb8fc92..db073f59d0de7a1b2acf2e1d869e55d4ee459dfd 100644 (file)
@@ -334,7 +334,9 @@ USA.
                    (integrate/name expression expression info environment)))
               (if new-expression
                   (begin (variable/integrated! variable)
-                         new-expression)
+                         (integrate/expression operations
+                                               environment
+                                               new-expression))
                   (dont-integrate))))
 
           ((integrate-operator)