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

Gab*_*el 0 floating-point infinity swift

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

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

let norm = x / (y*z)

Run Code Online (Sandbox Code Playgroud)

“x”的类型是浮点型。我的代码中的问题是 x 达到无穷大太快。我想知道是否有办法让程序为“x”存储更高的值。那可能吗?

rob*_*off 5

你说

\n
\n

“x”的类型是浮点型。

\n
\n

Swift 没有 \xe2\x80\x9cfloat\xe2\x80\x9d 类型。它有一个类型Float;在 Swift 中,大写字母很重要。我假设你的意思是xhas type Float

\n

的范围Float约为 -3.4\xc3\x9710\xc2\xb3\xe2\x81\xb8 到 +3.4\xc3\x9710\xc2\xb3\xe2\x81\xb8。如果您需要更多范围,可以尝试使用Double,其范围约为 \xc2\xb11.8\xc3\x9710\xc2\xb3\xe2\x81\xb0\xe2\x81\xb8。

\n

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

\n
let x = tgamma(Double(a) + Double(b))\nlet y = tgamma(Double(a))\nlet z = tgamma(Double(b))\n\nlet norm = x / (y*z)\n
Run Code Online (Sandbox Code Playgroud)\n

但是,由于tgamma(又名 \xce\x93,gamma 函数)增长很快,您可能需要改用它lgammalgamma返回 \xce\x93 的自然对数的绝对值,因此它会为更大范围的输入返回有限答案。如果您的输入是积极的,这应该有效:

\n
// log(x / (y * z)) = log x - (log y + log z)\n\nlet lx: Double = lgamma(Double(a) + Double(b))\nlet ly: Double = lgamma(Double(a))\nlet lz: Double = lgamma(Double(b))\n\nlet lnorm = lx - (ly + lz)\nlet norm = exp(lnorm)\n
Run Code Online (Sandbox Code Playgroud)\n