将 Double 分解为 swift 中的符号、尾数和指数:检查我的工作
Decomposing Double into sign, mantissa and exponent in swift: check my work
我在下面将此扩展添加到 Double 以将 Double 分解为 Swift 中的整数尾数和指数。我测试了它的多个值,包括 DBL_MAX 和 -DBL_MAX。我的问题是:
(1) 某处是否有内置方法或函数已经执行此操作? (2) 对于所有环境、所有双打,这是否正确?有什么办法可能会失败吗? (3) 有没有办法让它更高效但仍然便携?
感谢您的建议。
extension Double {
func decomp () -> (mantissa:Int64,exponent:Int64) {
var (a,b) = frexp(self)
var exponent = Int64(b)
while floor(a) != a {
a *= 2
exponent--
}
let mantissa = Int64(floor(a))
return (mantissa, exponent)
}
}
据我所知,这应该很简单,但行不通,
Double 结构遵守的 https://github.com/apple/swift/blob/master/stdlib/public/core/FloatingPoint.swift.gyb 定义的 FloatingPoint 协议已经定义了一个指数和一个尾数变量(分别在第 207 行和第 231 行)。
而 Double 结构 https://github.com/apple/swift/blob/master/stdlib/public/core/FloatingPointTypes.swift.gyb 定义了第 389 行的指数和第 398 行的有效数字。
从Swift3开始有属性Double.exponent, Double.significand and Double.sign.
我在下面将此扩展添加到 Double 以将 Double 分解为 Swift 中的整数尾数和指数。我测试了它的多个值,包括 DBL_MAX 和 -DBL_MAX。我的问题是: (1) 某处是否有内置方法或函数已经执行此操作? (2) 对于所有环境、所有双打,这是否正确?有什么办法可能会失败吗? (3) 有没有办法让它更高效但仍然便携?
感谢您的建议。
extension Double {
func decomp () -> (mantissa:Int64,exponent:Int64) {
var (a,b) = frexp(self)
var exponent = Int64(b)
while floor(a) != a {
a *= 2
exponent--
}
let mantissa = Int64(floor(a))
return (mantissa, exponent)
}
}
据我所知,这应该很简单,但行不通,
Double 结构遵守的 https://github.com/apple/swift/blob/master/stdlib/public/core/FloatingPoint.swift.gyb 定义的 FloatingPoint 协议已经定义了一个指数和一个尾数变量(分别在第 207 行和第 231 行)。
而 Double 结构 https://github.com/apple/swift/blob/master/stdlib/public/core/FloatingPointTypes.swift.gyb 定义了第 389 行的指数和第 398 行的有效数字。
从Swift3开始有属性Double.exponent, Double.significand and Double.sign.