Spec-Zone.ru › Ruby 2.5

модуль CMath

Включаемые модули:
Math

Тригонометрические и трансцендентные функции для комплексных чисел.

CMath - это библиотека, предоставляющая тригонометрические и трансцендентные функции для комплексных чисел. Функции в этом модуле принимают в качестве аргументов целые числа, числа с плавающей точкой или комплексные числа.

Обратите внимание, что набор функций похож, но не идентичен набору функций в модуле math. Причина наличия двух модулей заключается в том, что некоторые пользователи не заинтересованы в комплексных числах и, возможно, даже не знают, что это такое. Им бы скорее хотелось, чтобы Math.sqrt вызывал исключение, чем возвращал комплексное число.

Для получения дополнительной информации вы можете посмотреть класс Complex.

Использование

Чтобы начать использовать эту библиотеку, просто подключите библиотеку cmath:

require "cmath"

Открытые методы класса

acos(z) Показать исходный код
# File lib/cmath.rb, line 280
def acos(z)
  begin
    if z.real? and z >= -1 and z <= 1
      RealMath.acos(z)
    else
      (-1.0).i * log(z + 1.0.i * sqrt(1.0 - z * z))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает арккосинус z

CMath.acos(1 + 1i) #=> (0.9045568943023813-1.0612750619050357i)
acosh(z) Показать исходный код
# File lib/cmath.rb, line 345
def acosh(z)
  begin
    if z.real? and z >= 1
      RealMath.acosh(z)
    else
      log(z + sqrt(z * z - 1.0))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

возвращает обратный гиперболический косинус z

CMath.acosh(1 + 1i) #=> (1.0612750619050357+0.9045568943023813i)
asin(z) Показать исходный код
# File lib/cmath.rb, line 264
def asin(z)
  begin
    if z.real? and z >= -1 and z <= 1
      RealMath.asin(z)
    else
      (-1.0).i * log(1.0.i * z + sqrt(1.0 - z * z))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает арксинус z

CMath.asin(1 + 1i) #=> (0.6662394324925153+1.0612750619050355i)
asinh(z) Показать исходный код
# File lib/cmath.rb, line 329
def asinh(z)
  begin
    if z.real?
      RealMath.asinh(z)
    else
      log(z + sqrt(1.0 + z * z))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

возвращает обратный гиперболический синус z

CMath.asinh(1 + 1i) #=> (1.0612750619050357+0.6662394324925153i)
atan(z) Показать исходный код
# File lib/cmath.rb, line 296
def atan(z)
  begin
    if z.real?
      RealMath.atan(z)
    else
      1.0.i * log((1.0.i + z) / (1.0.i - z)) / 2.0
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает арктангенс z

CMath.atan(1 + 1i) #=> (1.0172219678978514+0.4023594781085251i)
atan2(y,x) Показать исходный код
# File lib/cmath.rb, line 313
def atan2(y,x)
  begin
    if y.real? and x.real?
      RealMath.atan2(y,x)
    else
      (-1.0).i * log((x + 1.0.i * y) / sqrt(x * x + y * y))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

возвращает арктангенс y деленного на x используя знаки y и x для определения квадранта

CMath.atan2(1 + 1i, 0) #=> (1.5707963267948966+0.0i)
atanh(z) Показать исходный код
# File lib/cmath.rb, line 361
def atanh(z)
  begin
    if z.real? and z >= -1 and z <= 1
      RealMath.atanh(z)
    else
      log((1.0 + z) / (1.0 - z)) / 2.0
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

возвращает обратный гиперболический тангенс z

CMath.atanh(1 + 1i) #=> (0.4023594781085251+1.0172219678978514i)
cbrt(z) Показать исходный код
# File lib/cmath.rb, line 156
def cbrt(z)
  z ** (1.0/3)
end

Возвращает главное значение кубического корня из z

CMath.cbrt(1 + 4i) #=> (1.449461632813119+0.6858152562177092i)
cos(z) Показать исходный код
# File lib/cmath.rb, line 181
def cos(z)
  begin
    if z.real?
      RealMath.cos(z)
    else
      Complex(RealMath.cos(z.real) * RealMath.cosh(z.imag),
              -RealMath.sin(z.real) * RealMath.sinh(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает косинус z, где z задан в радианах

CMath.cos(1 + 1i) #=> (0.8337300251311491-0.9888977057628651i)
cosh(z) Показать исходный код
# File lib/cmath.rb, line 231
def cosh(z)
  begin
    if z.real?
      RealMath.cosh(z)
    else
      Complex(RealMath.cosh(z.real) * RealMath.cos(z.imag),
              RealMath.sinh(z.real) * RealMath.sin(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает гиперболический косинус z, где z задан в радианах

CMath.cosh(1 + 1i) #=> (0.8337300251311491+0.9888977057628651i)
exp(z) Показать исходный код
# File lib/cmath.rb, line 61
def exp(z)
  begin
    if z.real?
      RealMath.exp(z)
    else
      ere = RealMath.exp(z.real)
      Complex(ere * RealMath.cos(z.imag),
              ere * RealMath.sin(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Math::E, возведенное в степень z

CMath.exp(1.i * Math::PI) #=> (-1.0+1.2246467991473532e-16i)
log(z, b=::Math::E) Показать исходный код
# File lib/cmath.rb, line 81
def log(z, b=::Math::E)
  begin
    if z.real? && z >= 0 && b >= 0
      RealMath.log(z, b)
    else
      Complex(RealMath.log(z.abs), z.arg) / log(b)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает натуральный логарифм Complex. Если задан второй аргумент, он будет основанием логарифма.

CMath.log(1 + 4i)     #=> (1.416606672028108+1.3258176636680326i)
CMath.log(1 + 4i, 10) #=> (0.6152244606891369+0.5757952953408879i)
log10(z) Показать исходный код
# File lib/cmath.rb, line 113
def log10(z)
  begin
    if z.real? and z >= 0
      RealMath.log10(z)
    else
      log(z) / RealMath.log(10)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает десятичный логарифм z

CMath.log10(-1) #=> (0.0+1.3643763538418412i)
log2(z) Показать исходный код
# File lib/cmath.rb, line 97
def log2(z)
  begin
    if z.real? and z >= 0
      RealMath.log2(z)
    else
      log(z) / RealMath.log(2)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает двоичный логарифм z

CMath.log2(-1) => (0.0+4.532360141827194i)
sin(z) Показать исходный код
# File lib/cmath.rb, line 164
def sin(z)
  begin
    if z.real?
      RealMath.sin(z)
    else
      Complex(RealMath.sin(z.real) * RealMath.cosh(z.imag),
              RealMath.cos(z.real) * RealMath.sinh(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает синус z, где z задан в радианах

CMath.sin(1 + 1i) #=> (1.2984575814159773+0.6349639147847361i)
sinh(z) Показать исходный код
# File lib/cmath.rb, line 214
def sinh(z)
  begin
    if z.real?
      RealMath.sinh(z)
    else
      Complex(RealMath.sinh(z.real) * RealMath.cos(z.imag),
              RealMath.cosh(z.real) * RealMath.sin(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает гиперболический синус z, где z задан в радианах

CMath.sinh(1 + 1i) #=> (0.6349639147847361+1.2984575814159773i)
sqrt(z) Показать исходный код
# File lib/cmath.rb, line 129
def sqrt(z)
  begin
    if z.real?
      if z < 0
        Complex(0, RealMath.sqrt(-z))
      else
        RealMath.sqrt(z)
      end
    else
      if z.imag < 0 ||
          (z.imag == 0 && z.imag.to_s[0] == '-')
        sqrt(z.conjugate).conjugate
      else
        r = z.abs
        x = z.real
        Complex(RealMath.sqrt((r + x) / 2.0), RealMath.sqrt((r - x) / 2.0))
      end
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает неотрицательный квадратный корень из Complex.

CMath.sqrt(-1 + 0i) #=> 0.0+1.0i
tan(z) Показать исходный код
# File lib/cmath.rb, line 198
def tan(z)
  begin
    if z.real?
      RealMath.tan(z)
    else
      sin(z) / cos(z)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает тангенс z, где z задан в радианах

CMath.tan(1 + 1i) #=> (0.27175258531951174+1.0839233273386943i)
tanh(z) Показать исходный код
# File lib/cmath.rb, line 248
def tanh(z)
  begin
    if z.real?
      RealMath.tanh(z)
    else
      sinh(z) / cosh(z)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает гиперболический тангенс z, где z задан в радианах

CMath.tanh(1 + 1i) #=> (1.0839233273386943+0.27175258531951174i)

Свойства методов экземпляра (приватные)

acos(z) Показать исходный код
# File lib/cmath.rb, line 280
def acos(z)
  begin
    if z.real? and z >= -1 and z <= 1
      RealMath.acos(z)
    else
      (-1.0).i * log(z + 1.0.i * sqrt(1.0 - z * z))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает арккосинус z

CMath.acos(1 + 1i) #=> (0.9045568943023813-1.0612750619050357i)
acosh(z) Показать исходный код
# File lib/cmath.rb, line 345
def acosh(z)
  begin
    if z.real? and z >= 1
      RealMath.acosh(z)
    else
      log(z + sqrt(z * z - 1.0))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

возвращает обратную гиперболическую косинус z

CMath.acosh(1 + 1i) #=> (1.0612750619050357+0.9045568943023813i)
asin(z) Показать исходный код
# File lib/cmath.rb, line 264
def asin(z)
  begin
    if z.real? and z >= -1 and z <= 1
      RealMath.asin(z)
    else
      (-1.0).i * log(1.0.i * z + sqrt(1.0 - z * z))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает арксинус z

CMath.asin(1 + 1i) #=> (0.6662394324925153+1.0612750619050355i)
asinh(z) Показать исходный код
# File lib/cmath.rb, line 329
def asinh(z)
  begin
    if z.real?
      RealMath.asinh(z)
    else
      log(z + sqrt(1.0 + z * z))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

возвращает обратную гиперболический синус z

CMath.asinh(1 + 1i) #=> (1.0612750619050357+0.6662394324925153i)
atan(z) Показать исходный код
# File lib/cmath.rb, line 296
def atan(z)
  begin
    if z.real?
      RealMath.atan(z)
    else
      1.0.i * log((1.0.i + z) / (1.0.i - z)) / 2.0
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает арктангенс z

CMath.atan(1 + 1i) #=> (1.0172219678978514+0.4023594781085251i)
atan2(y,x) Показать исходный код
# File lib/cmath.rb, line 313
def atan2(y,x)
  begin
    if y.real? and x.real?
      RealMath.atan2(y,x)
    else
      (-1.0).i * log((x + 1.0.i * y) / sqrt(x * x + y * y))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

возвращает арктангенс y деленное на x, используя знаки y и x для определения квадранта

CMath.atan2(1 + 1i, 0) #=> (1.5707963267948966+0.0i)
atanh(z) Показать исходный код
# File lib/cmath.rb, line 361
def atanh(z)
  begin
    if z.real? and z >= -1 and z <= 1
      RealMath.atanh(z)
    else
      log((1.0 + z) / (1.0 - z)) / 2.0
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

возвращает обратный гиперболический тангенс z

CMath.atanh(1 + 1i) #=> (0.4023594781085251+1.0172219678978514i)
cbrt(z) Показать исходный код
# File lib/cmath.rb, line 156
def cbrt(z)
  z ** (1.0/3)
end

Возвращает главное значение кубического корня из z

CMath.cbrt(1 + 4i) #=> (1.449461632813119+0.6858152562177092i)
cos(z) Показать исходный код
# File lib/cmath.rb, line 181
def cos(z)
  begin
    if z.real?
      RealMath.cos(z)
    else
      Complex(RealMath.cos(z.real) * RealMath.cosh(z.imag),
              -RealMath.sin(z.real) * RealMath.sinh(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает косинус z, где z дано в радианах

CMath.cos(1 + 1i) #=> (0.8337300251311491-0.9888977057628651i)
cosh(z) Показать исходный код
# File lib/cmath.rb, line 231
def cosh(z)
  begin
    if z.real?
      RealMath.cosh(z)
    else
      Complex(RealMath.cosh(z.real) * RealMath.cos(z.imag),
              RealMath.sinh(z.real) * RealMath.sin(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает гиперболический косинус z, где z дано в радианах

CMath.cosh(1 + 1i) #=> (0.8337300251311491+0.9888977057628651i)
exp(z) Показать исходный код
# File lib/cmath.rb, line 61
def exp(z)
  begin
    if z.real?
      RealMath.exp(z)
    else
      ere = RealMath.exp(z.real)
      Complex(ere * RealMath.cos(z.imag),
              ere * RealMath.sin(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Math::E в степени z

CMath.exp(1.i * Math::PI) #=> (-1.0+1.2246467991473532e-16i)
log(z, b=::Math::E) Показать исходный код
# File lib/cmath.rb, line 81
def log(z, b=::Math::E)
  begin
    if z.real? && z >= 0 && b >= 0
      RealMath.log(z, b)
    else
      Complex(RealMath.log(z.abs), z.arg) / log(b)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает натуральный логарифм Complex. Если задан второй аргумент, он будет основанием логарифма.

CMath.log(1 + 4i)     #=> (1.416606672028108+1.3258176636680326i)
CMath.log(1 + 4i, 10) #=> (0.6152244606891369+0.5757952953408879i)
log10(z) Показать исходный код
# File lib/cmath.rb, line 113
def log10(z)
  begin
    if z.real? and z >= 0
      RealMath.log10(z)
    else
      log(z) / RealMath.log(10)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает логарифм по основанию 10 от z

CMath.log10(-1) #=> (0.0+1.3643763538418412i)
log2(z) Показать исходный код
# File lib/cmath.rb, line 97
def log2(z)
  begin
    if z.real? and z >= 0
      RealMath.log2(z)
    else
      log(z) / RealMath.log(2)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает логарифм по основанию 2 от z

CMath.log2(-1) => (0.0+4.532360141827194i)
sin(z) Показать исходный код
# File lib/cmath.rb, line 164
def sin(z)
  begin
    if z.real?
      RealMath.sin(z)
    else
      Complex(RealMath.sin(z.real) * RealMath.cosh(z.imag),
              RealMath.cos(z.real) * RealMath.sinh(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает синус z, где z дано в радианах

CMath.sin(1 + 1i) #=> (1.2984575814159773+0.6349639147847361i)
sinh(z) Показать исходный код
# File lib/cmath.rb, line 214
def sinh(z)
  begin
    if z.real?
      RealMath.sinh(z)
    else
      Complex(RealMath.sinh(z.real) * RealMath.cos(z.imag),
              RealMath.cosh(z.real) * RealMath.sin(z.imag))
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает гиперболический синус z, где z дано в радианах

CMath.sinh(1 + 1i) #=> (0.6349639147847361+1.2984575814159773i)
sqrt(z) Показать исходный код
# File lib/cmath.rb, line 129
def sqrt(z)
  begin
    if z.real?
      if z < 0
        Complex(0, RealMath.sqrt(-z))
      else
        RealMath.sqrt(z)
      end
    else
      if z.imag < 0 ||
          (z.imag == 0 && z.imag.to_s[0] == '-')
        sqrt(z.conjugate).conjugate
      else
        r = z.abs
        x = z.real
        Complex(RealMath.sqrt((r + x) / 2.0), RealMath.sqrt((r - x) / 2.0))
      end
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает неотрицательный квадратный корень из Complex.

CMath.sqrt(-1 + 0i) #=> 0.0+1.0i
tan(z) Показать исходный код
# File lib/cmath.rb, line 198
def tan(z)
  begin
    if z.real?
      RealMath.tan(z)
    else
      sin(z) / cos(z)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает тангенс z, где z дано в радианах

CMath.tan(1 + 1i) #=> (0.27175258531951174+1.0839233273386943i)
tanh(z) Показать исходный код
# File lib/cmath.rb, line 248
def tanh(z)
  begin
    if z.real?
      RealMath.tanh(z)
    else
      sinh(z) / cosh(z)
    end
  rescue NoMethodError
    handle_no_method_error
  end
end

Возвращает гиперболический тангенс z, где z дано в радианах

CMath.tanh(1 + 1i) #=> (1.0839233273386943+0.27175258531951174i)

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API