gosh> (define (log10 n) (/ (log n) (log 10))) log10 gosh> (log10 10) 1.0 gosh> (log10 100) 2.0 gosh> (log10 1000) 2.9999999999999996
むむ?
gosh> (define (power x n) (if (= n 1) x (* x (power x (- n 1))) ) ) power gosh> (power 2 2) 4 gosh> (power 10 3) 1000 gosh> (define (power10 n) (power 10 n)) power10 gosh> (map power10 '(1 2 3 4 5 6 7 8 9 10)) (10 100 1000 10000 100000 1000000 10000000 100000000 1000000000 10000000000) gosh> (map log10 (map power10 '(1 2 3 4 5 6 7 8 9 10))) (1.0 2.0 2.9999999999999996 4.0 5.0 5.999999999999999 7.0 8.0 8.999999999999998 10.0)
guileでは
guile> (define (log10 n) (/ (log n) (log 10))) guile> (define (power x n) (if (= n 1) x (* x (power x (- n 1))))) guile> (define (power10 n) (power 10 n)) guile> (map log10 (map power10 '( 1 2 3 4 5 6 7 8 9 10))) (1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0)
おお!
↓コメントいただいてます↓
shiro 2011/06/23 06:37
それはguileの表示ルーチンが、内部的に2.999...996である数値を単に丸めて表示しているだけだと思います。guile 1.8.7にて:guile> (/ (log 1000) (log 10))
3.0
guile> (eqv? (/ (log 1000) (log 10)) 3.0)
#f
guile> (- (/ (log 1000) (log 10)) 3.0)
-4.44089209850063e-16
Gaucheは、内部的に違う数値は区別できるように表示しています
guile> (truncate (log10 100)) 2.0 guile> (truncate (log10 1000)) 2.0
むむ