【问题标题】:Decomposing Double into sign, mantissa and exponent in swift: check my work快速将 Double 分解为符号、尾数和指数:检查我的工作
【发布时间】:2016-05-13 15:50:40
【问题描述】:

我在下面的 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 floating-point double


    【解决方案1】:

    据我所知,这应该很容易,但它不起作用,

    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 行的有效位。

    【讨论】:

    • 谢谢——这正是我需要知道的。在过去的几周里,我才刚刚开始将我的东西移植到 swift 中,而且我不知道源代码如此容易获得。
    【解决方案2】:

    从 Swift 3 开始,有属性 Double.exponentDouble.significandDouble.sign

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      相关资源
      最近更新 更多