Как мне конвертировать android математическую функцию в swift с logb - PullRequest
1 голос
/ 28 апреля 2020

Привет, ребята, я использовал формулу в android приложении

valor = Math.pow(2.7183d, (((1.17896d * diametro) / 100.0d) + (0.8241d * logb(diametro / 100.0d, 2.7183d))) + 3.4987d);

, сейчас я реализую его в Swift ios, но я не могу найти решение для logb (double, double) единственный активный на swift это logb (double)

resultado = pow(2.7183, (((2.006969 * diametro!) / 100.0) - (0.445893 * logb(diametro! / 100.0, 2.7183))) + 2.755621)

но я получаю "Компилятор не может проверить это выражение в разумное время, попробуйте разбить выражение в различные подвыражения "

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Как Ларм предложил в комментарии выше, просто разбейте уравнение по частям, потому что иногда компилятор не может обработать сложное уравнение из-за его длины.

original equation: 


 resultado = pow(2.7183, (((2.006969 * diametro!) / 100.0) - (0.445893 * logb(diametro! / 100.0, 2.7183))) + 2.755621)

Попробуйте выполнить следующее:

Let equation1 = 0.445893 * logb(diametro! / 100.0, 2.7183)
Let equation 2 = (2.006969 * diametro!)/100.0
Let equation 3 =  (equation2 - (equation1)) + 2.75562

resultado = pow(2.7183, equation3)

Вы также можете попробовать его комбинации или уменьшить количество шагов.

0 голосов
/ 28 апреля 2020

Из вашего примера видно, что logb(double, double) является логарифмической функцией, которая возвращает лог в указанное base. Для Swift нет эквивалента, но вы можете написать свой собственный, используя стандартную функцию log:

func logbase(_ n: Double, _ base: Double) -> Double {
    return log(n) / log(base)
}

Тем не менее, ваша оригинальная функция использует logb, чтобы найти логарифм для основания 2.7183 которая является той же самой базой, которую log использует естественно (ну, до 4 десятичных знаков), поэтому

logbase(n, 2.7183)

и

log(n)

по существу дают тот же результат.

Кроме того, ваша формула использует pow(2.7183, n) для поднятия базы 2.7183 до степени.

Но

pow(2.7183, n)

и

exp(n)

Дать аналогичный результат (отличается только потому, что exp использует более точное значение для e - основание натуральные логарифмы).

Собрав их вместе, ваша формула может быть записана как:

let valor = exp( ((1.17896 * diametro) / 100.0) + (0.8241 * log(diametro / 100.0)) + 3.4987 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...