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

Value reaches infinity too fast, how do I stop that from happening? (how do I make the program store higher numbers?)

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

let x = tgamma(a+b)
let y = tgamma(a)
let z = tgamma(b)

let norm = x / (y*z)

'x'的类型是float。我的代码中的问题是 x 达到无穷大的速度太快。我想知道是否有办法让程序为 'x' 存储更高的值。这可能吗?

你说

The type of 'x' is 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(也称为 Γ,伽玛函数)增长很快,您可能想改用 lgammalgamma returns Γ 的自然对数的绝对值,因此它 returns 有限的答案适用于更大范围的输入。如果您的输入是肯定的,这应该有效:

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