 
 This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Taking Logarithms | ||
|---|---|---|
| Code | Expected | Actual | 
| Math.log(1) | 0.0 | 0.0 | 
| Math.log(Math::E) | 1.0 | 1.0 | 
| Math.log(10) | 2.30258509299405 | 2.30258509299405 | 
| Math::E ** Math.log(25) | 25.0 | 25.0 | 
| Math.log10(1) | 0.0 | 0.0 | 
| Math.log10(10) | 1.0 | 1.0 | 
| Math.log10(10.1) | 1.00432137378264 | 1.00432137378264 | 
| Math.log10(1000) | 3.0 | 3.0 | 
| 10 ** Math.log10(25) | 25.0 | 25.0 | 
| module Math
  def Math.logb(num, base)
    log(num) / log(base)
  end
end
dividend = Math.log(2)
(1..6).collect { |x| Math.log(x) / dividend } | [0.0, 1.0, 1.58496250072116, 2.0, 2.32192809488736, 2.58496250072116] | [0.0, 1.0, 1.58496250072116, 2.0, 2.32192809488736, 2.58496250072116] | 
| require 'bigdecimal'
require 'bigdecimal/math'
require 'bigdecimal/util'
module BigMath
  alias :log_slow :log
  def log(x, prec)
    if x <= 0 || prec <= 0
      raise ArgumentError, "Zero or negative argument for log"
    end
    return x if x.infinite? || x.nan?
    sign, fraction, power, exponent = x.split
    fraction = BigDecimal(".#{fraction}")
    power = power.to_s.to_d
    log_slow(fraction, prec) + (log_slow(power, prec) * exponent)
  end
end
include BigMath
number = BigDecimal("1234.5678")
Math.log(number) | 7.11847622829779 | 7.11847622829779 | 
| prec = 50
BigMath.log_slow(number, prec).round(prec).to_s("F") | "7.11847622829778629250879253638708184134073214145175" | "7.11847622829778629250879253638708184134073214145175" | 
| BigMath.log(number, prec).round(prec).to_s("F") | "7.11847622829778629250879253638708184134073214145175" | "7.11847622829778629250879253638708184134073214145175" | 
| BigMath.log(number ** 1000, prec).round(prec).to_s("F") | "7118.47622829778629250879253638708184134073214145175161" | "7118.47622829778629250879253638708184134073214145175161" | 
| huge_number = BigDecimal("1000") ** 1000
base = BigDecimal("10")
(BigMath.log(huge_number, 100) / BigMath.log(base, 100)).to_f | 3000.0 | 3000.0 |