Method: BigMath.sin
- Defined in:
- lib/bigdecimal/math.rb
.sin(x, prec) ⇒ Object
call-seq:
sin(decimal, numeric) -> BigDecimal
Computes the sine of decimal to the specified number of digits of precision, numeric.
If decimal is Infinity or NaN, returns NaN.
BigMath.sin(BigMath.PI(5)/4, 32).to_s
#=> "0.70710807985947359435812921837984e0"
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
# File 'lib/bigdecimal/math.rb', line 155 def sin(x, prec) prec = BigDecimal::Internal.coerce_validate_prec(prec, :sin) x = BigDecimal::Internal.coerce_to_bigdecimal(x, prec, :sin) return BigDecimal::Internal.nan_computation_result if x.infinite? || x.nan? n = prec + BigDecimal.double_fig one = BigDecimal("1") two = BigDecimal("2") sign, x = _sin_periodic_reduction(x, n) x1 = x x2 = x.mult(x,n) y = x d = y i = one z = one while d.nonzero? && ((m = n - (y.exponent - d.exponent).abs) > 0) m = BigDecimal.double_fig if m < BigDecimal.double_fig x1 = -x2.mult(x1,n) i += two z *= (i-one) * i d = x1.div(z,m) y += d end y = BigDecimal("1") if y > 1 y.mult(sign, prec) end |