自然対数の底eの計算

30分プログラム、その632。自然対数の底eを計算してみよう。
wikipedia:ネイピア数曰く、exp(x)=\sum^{\infty}_{n=0}\frac{x^n}{n!}にx=1を代入することで計算できるらしい。
sumの計算をどうするかがポイントだろうけど、とりあえずutil.streamを使って計算してみた。

使い方

;; 第100項までを使って計算する
gosh> (exp 1 100)
2.7182818284590455

ソースコード

#! /opt/local/bin/gosh
;; -*- mode:scheme; coding:utf-8 -*-
;;
;; e.scm -
;;
;; Copyright(C) 2009 by mzp
;; Author: MIZUNO Hiroki / mzpppp at gmail dot com
;; http://howdyworld.org
;;
;; Timestamp: 2009/08/02 21:10:57
;;
;; This program is free software; you can redistribute it and/or
;; modify it under MIT Lincence.
;;

(use util.stream)

(define (fact n)
  (if (= n 0)
      1
      (* n (fact (- n 1)))))

(define (facts n prev)
  (stream-cons prev
	       (facts (+ n 1)
		      (* (if (= n 0) 1 n) prev))))

(define (pows x prev)
  (stream-cons prev
	       (pows x (* x prev))))

(define facts-stream    (facts 1 1))
(define (pows-stream x) (pows  x 1))

(define (exp x n)
  (fold +
	0
	(stream->list (stream-take (stream-map /.
					       (pows-stream x)
					       facts-stream)
				   n))))