我在下面的 Double 中添加了这个扩展,以便在 Swift 中将 Double 分解为整数尾数和指数。我已经测试了它的许多值,包括 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)
}
}
从 Swift 3 开始,有属性 Double.exponent、Double.significand 和 Double.sign.
据我所知,这应该很容易,但它不起作用,
定义的浮点协议 https://github.com/apple/swift/blob/master/stdlib/public/core/FloatingPoint.swift.gyb,Double 结构体所遵循的浮点协议已经定义了指数和尾数变量(分别在第 207 行和第 231 行)。
Double 结构体 https://github.com/apple/swift/blob/master/stdlib/public/core/FloatingPointTypes.swift.gyb 定义第 389 行的指数和第 398 行的有效数。