【问题标题】:How do i convert android math function to swift with logb如何使用 logb 将 android 数学函数转换为 swift
【发布时间】:2020-04-28 09:50:53
【问题描述】:

大家好,我一直在安卓应用上使用这个公式

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) p>

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

但我得到“编译器无法在合理的时间内对该表达式进行类型检查;尝试将表达式分解为不同的子表达式”

【问题讨论】:

  • "尝试将表达式分解为不同的子表达式" 你认为这是什么意思?您正在使用过于复杂的计算。打破它。比如“让 someVar = (2.006969 * diametro!) / 100.0,然后在结果计算中使用。等
  • logb(double, double) 是做什么的?

标签: android ios swift


【解决方案1】:

从您的示例中,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 )

【讨论】:

  • 最好的答案,伙计,你省钱了,我真的很感谢你的帮助
【解决方案2】:

正如 Larme 在上面的评论中所建议的,只需将方程分解为部分,因为有时编译器由于其长度而无法处理复杂的方程。

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)

您也可以尝试组合它或减少步骤。

【讨论】:

    猜你喜欢
    • 2017-04-14
    • 2020-10-10
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多