gaucheノート  log 対数

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

むむ