Реальный кубический корень отрицательного числа

Я пытаюсь увидеть, есть ли функция, чтобы напрямую получить реальный кубический корень отрицательного числа. Например, в Java существует функция Math.cbrt(). Я ищу эквивалент в R.

В противном случае мой текущий взлом:

x <- -8
sign(x) * abs(x)^(1/3)

который является очень неэлегантным и громоздким, чтобы печатать каждый раз. спасибо!

Ответ 1

Похоже, вам просто нужно определить свою собственную функцию Math.cbrt().

Это превратит выполнение операции из чего-то неэлегантного и громоздкого в нечто чистое, выразительное и легкое в применении:

Math.cbrt <- function(x) {
    sign(x) * abs(x)^(1/3)
}

x <- c(-1, -8, -27, -64)

Math.cbrt(x)
# [1] -1 -2 -3 -4

Ответ 2

В R вам, вероятно, необходимо определить новую функцию, которая ограничивает результаты для ваших целей:

> realpow <- function(x,rad) if(x < 0){ - (-x)^(rad)}else{x^rad}
> realpow(-8, 1/3)
[1] -2
> realpow(8, 1/3)
[1] 2

Можно сделать операцию инфикса, если вы процитируете оператора и используете в его имени соответствующие знаки "%". Поскольку его приоритет низкий, вам нужно будет использовать круглые скобки, но вы уже знаете, что это известно.

> `%r^%` <- function(x, rad) realpow(x,rad)
>  -8 %r^% 1/3
[1] -2.666667    # Wrong
> -8 %r^% (1/3)
[1] -2   #Correct

Согласитесь с включением версии опроса для его векторизованной емкости:

`%r^%` <- function(x, rad) sign(x)*abs(x)^(rad)

Ответ 3

В Java что-то вроде этого:

There are 3 cube-roots. Assuming you want the root that is real, you should do this:

x = 8;  //  Your value

if (x > 0)
    System.out.println(Math.pow(x, 1.0 / 3.0));
else
    System.out.println(-Math.pow(-x, 1.0 / 3.0));