require 'mathn' # Math will convert unit objects to radians and then attempt to use the value for # trigonometric functions. module Math alias :unit_sqrt :sqrt # @return [Numeric] def sqrt(n) if RubyUnits::Unit === n (n**(Rational(1,2))).to_unit else unit_sqrt(n) end end # @return [Numeric] module_function :unit_sqrt # @return [Numeric] module_function :sqrt #:nocov: if self.respond_to?(:cbrt) alias :unit_cbrt :cbrt # @return [Numeric] def cbrt(n) if RubyUnits::Unit === n (n**(Rational(1,3))).to_unit else unit_cbrt(n) end end # @return [Numeric] module_function :unit_cbrt # @return [Numeric] module_function :cbrt end #:nocov: alias :unit_sin :sin # @return [Numeric] def sin(n) RubyUnits::Unit === n ? unit_sin(n.convert_to('radian').scalar) : unit_sin(n) end # @return [Numeric] module_function :unit_sin # @return [Numeric] module_function :sin alias :unit_cos :cos # @return [Numeric] def cos(n) RubyUnits::Unit === n ? unit_cos(n.convert_to('radian').scalar) : unit_cos(n) end # @return [Numeric] module_function :unit_cos # @return [Numeric] module_function :cos alias :unit_sinh :sinh # @return [Numeric] def sinh(n) RubyUnits::Unit === n ? unit_sinh(n.convert_to('radian').scalar) : unit_sinh(n) end # @return [Numeric] module_function :unit_sinh # @return [Numeric] module_function :sinh alias :unit_cosh :cosh # @return [Numeric] def cosh(n) RubyUnits::Unit === n ? unit_cosh(n.convert_to('radian').scalar) : unit_cosh(n) end # @return [Numeric] module_function :unit_cosh # @return [Numeric] module_function :cosh alias :unit_tan :tan # @return [Numeric] def tan(n) RubyUnits::Unit === n ? unit_tan(n.convert_to('radian').scalar) : unit_tan(n) end # @return [Numeric] module_function :tan # @return [Numeric] module_function :unit_tan alias :unit_tanh :tanh # @return [Numeric] def tanh(n) RubyUnits::Unit === n ? unit_tanh(n.convert_to('radian').scalar) : unit_tanh(n) end # @return [Numeric] module_function :unit_tanh # @return [Numeric] module_function :tanh alias :unit_hypot :hypot # Convert parameters to consistent units and perform the function # @return [Numeric] def hypot(x,y) if RubyUnits::Unit === x && RubyUnits::Unit === y (x**2 + y**2)**(1/2) else unit_hypot(x,y) end end # @return [Numeric] module_function :unit_hypot # @return [Numeric] module_function :hypot alias :unit_atan2 :atan2 # @return [Numeric] def atan2(x,y) case when (x.is_a?(RubyUnits::Unit) && y.is_a?(RubyUnits::Unit)) && (x !~ y) raise ArgumentError, "Incompatible RubyUnits::Units" when (x.is_a?(RubyUnits::Unit) && y.is_a?(RubyUnits::Unit)) && (x =~ y) Math::unit_atan2(x.base_scalar, y.base_scalar) else Math::unit_atan2(x,y) end end # @return [Numeric] module_function :unit_atan2 # @return [Numeric] module_function :atan2 end