Module: Math
- Defined in:
- lib/mathn.rb
Overview
When mathn is required, the Math module changes as follows:
Standard Math module behaviour:
Math.sqrt(4/9) # => 0.0
Math.sqrt(4.0/9.0) # => 0.666666666666667
Math.sqrt(- 4/9) # => Errno::EDOM: Numerical argument out of domain - sqrt
After require ‘mathn’, this is changed to:
require 'mathn'
Math.sqrt(4/9) # => 2/3
Math.sqrt(4.0/9.0) # => 0.666666666666667
Math.sqrt(- 4/9) # => Complex(0, 2/3)
Class Method Summary collapse
-
.rsqrt(a) ⇒ Object
Compute square root of a non negative number.
-
.sqrt(a) ⇒ Object
Computes the square root of
a
.
Class Method Details
.rsqrt(a) ⇒ Object
Compute square root of a non negative number. This method is internally used by Math.sqrt
.
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
# File 'lib/mathn.rb', line 120 def rsqrt(a) # :nodoc: if a.kind_of?(Float) sqrt!(a) elsif a.kind_of?(Rational) rsqrt(a.numerator)/rsqrt(a.denominator) else src = a max = 2 ** 32 byte_a = [src & 0xffffffff] # ruby's bug while (src >= max) and (src >>= 32) byte_a.unshift src & 0xffffffff end answer = 0 main = 0 side = 0 for elm in byte_a main = (main << 32) + elm side <<= 16 if answer != 0 if main * 4 < side * side applo = main.div(side) else applo = ((sqrt!(side * side + 4 * main) - side)/2.0).to_i + 1 end else applo = sqrt!(main).to_i + 1 end while (x = (side + applo) * applo) > main applo -= 1 end main -= x answer = (answer << 16) + applo side += applo * 2 end if main == 0 answer else sqrt!(a) end end end |
.sqrt(a) ⇒ Object
104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/mathn.rb', line 104 def sqrt(a) if a.kind_of?(Complex) sqrt!(a) elsif a.respond_to?(:nan?) and a.nan? a elsif a >= 0 rsqrt(a) else Complex(0,rsqrt(-a)) end end |