值达到无穷大太快,我如何阻止这种情况发生?(如何使程序存储更高的数字?)



这是我到目前为止的代码:

let x = tgamma(a+b)
let y = tgamma(a)
let z = tgamma(b)
let norm = x / (y*z)

"x"的类型为float。我代码中的问题是,x很快就会达到无穷大。我想知道是否有一种方法使程序存储更高的值为'x'。这可能吗?

你说

x的类型为float

Swift没有" float "类型。它的类型是Float;在Swift中,大写字母是重要的。我假设你的意思是x具有Float类型。

Float的范围约为-3.4×10³⁸~ +3.4×10³⁸。如果你需要更大的范围,你可以尝试使用Double,它的范围约为±1.8×10³⁰⁸。

要使用Double,请在调用tgamma之前将输入转换为Double。例子:

let x = tgamma(Double(a) + Double(b))
let y = tgamma(Double(a))
let z = tgamma(Double(b))
let norm = x / (y*z)

然而,由于tgamma(又名Γ,伽马函数)增长很快,您可能希望使用lgamma代替。lgamma返回Γ自然对数的绝对值,因此对于更大范围的输入,它返回有限的答案。如果你的输入是正的,这应该可以工作:

// log(x / (y * z)) = log x - (log y + log z)
let lx: Double = lgamma(Double(a) + Double(b))
let ly: Double = lgamma(Double(a))
let lz: Double = lgamma(Double(b))
let lnorm = lx - (ly + lz)
let norm = exp(lnorm)

你可以用对数函数代替,用计算值的加法和减法来代替乘法和除法

let x = lgamma(a+b)
let y = lgamma(a)
let z = lgamma(b)
let norm = x.0 - (y.0 + z.0)

最新更新