价值达到无穷大太快,我该如何阻止这种情况发生? (如何让程序存储更大的数字?)
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
(也称为 Γ,伽玛函数)增长很快,您可能想改用 lgamma
。 lgamma
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)
到目前为止,这是我的代码:
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
(也称为 Γ,伽玛函数)增长很快,您可能想改用 lgamma
。 lgamma
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)