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 |