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 |