【问题标题】:Floating point hex notation in SwiftSwift 中的浮点十六进制表示法
【发布时间】:2015-04-19 19:54:24
【问题描述】:

我不明白浮点数在 Swift 中如何以十六进制表示法表示。 Apple 的文档显示 0xC.3p0 等于十进制的 12.1875。有人可以指导我如何进行转换吗?我知道在十进制十六进制值 0xC = 12 之前。小数点后的 3p0 是我难住的地方。

【问题讨论】:

    标签: swift hex


    【解决方案1】:

    来自documentation

    浮点文字
    ...
    十六进制浮点文字由 0x 前缀组成,后跟 由一个可选的十六进制小数,后跟一个十六进制 指数。十六进制小数由一个小数点组成 后跟一系列十六进制数字。指数包括 一个大写或小写的 p 前缀,后跟一个十进制序列 表示 p 前面的值是 2 的幂的数字 乘以。例如,0xFp2 表示 15 × 22,它计算 到 60。类似地,0xFp-2 表示 15 × 2-2,其计算结果为 3.75。

    你的情况

    0xC.3p0 = (12 + 3/16) * 2^0 = 12.1875

    另一个例子:

    0xAB.CDp4 = (10*16 + 11 + 12/16 + 13/16^2) * 2^4 = 2748.8125

    此格式与%a printf 格式非常相似(参见示例 http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html)。 它可以用来直接指定一个浮点数 二进制 IEEE 754 表示,请参阅Why does Swift use base 2 for the exponent of hexadecimal floating point values? 了解更多信息。

    【讨论】:

    • 不错的答案。浮点数的十六进制文字的伟大之处在于它们总是精确的,而许多十进制值不能用浮点数精确表示。另外,如果您有翻译,请确保它会说地掷球。
    • 如果你想成为一个真正的极客,还要注意星球大战参考:)
    • @Martin,你的另一个例子有一个错误 - 0xC 是 12 而不是 13 而 0xD 是 13 ;) 不过最终结果是正确的。
    【解决方案2】:

    使用位值系统解释0xC.3p0

    C (or 12) is in the 16^0 place
    3 is in the 16^-1 place (and 3/16 == 0.1875)
    p says the exponent follows (like the e in 6.022e23 in base 10)
    0 is the exponent (in base 10) that is the power of 2 (2^0 == 1)
    

    所以把它们放在一起

    0xC.3p0 = (12 + (3/16)) * 2^0 = 12.1875
    

    【讨论】:

    • 文档对我来说似乎是承包商。首先它说“十六进制浮点文字由一个 0x 前缀组成,后跟一个可选的十六进制小数,然后是一个 hexadecimal 指数。”然后它说“指数由一个大写或小写的 p 前缀组成,后跟一系列十进制数字......”这听起来像是文档中的编辑错误。我的猜测是指数与表达式的其余部分一样以 16 为底。
    • 测试表明指数以 10 为底,但它代表 2 的幂。所以p10 代表 2^10 而不是 2^16
    • 为什么 Swift 十六进制浮点表示法采用 2 的幂的指数?在十进制中,科学计数法采用 10 的幂,它将值向上或向下移动一定数量的十进制数字。如果指数也是十六进制的,对我来说会更有意义。然后它将值向上或向下移动一定数量的十六进制数字。清晰一致。
    【解决方案3】:

    为了总结我读过的内容,您可以看到这些表示如下:

    0xC.3p0 = (12*16^0 + 3*16^-1) * 2^0 = 12.1875
    

    来自 Martin R 的上述示例:

    0xAB.CDp4 = (10*16^1 + 11*16^0 + 12*16^-1 + 13*16^-2) * 2^4 = 2748.8125
    

    【讨论】:

      【解决方案4】:

      正如你所说,0xC 是 12。小数部分为((1/16)*3)*10^0。

      所以你需要把小数部分除以 16。然后你需要将它乘以 2 的 p 后面的数字的幂

      【讨论】:

        【解决方案5】:

        十六进制 -(0-9,A=10,B=11,C=12,D=13,E=14,F=15)p0 表示 2^0 例如:- 0xC = 120x 前缀代表十六进制) 在0xC.3p0 中的小数部分之后,我们将数字除以 16 的幂

        所以这里是3/16 = 0.1875 所以0xC.3p0 = (12 + (3/16) ) 2^0

        如果是0xC.43p0,那么对于 4,我们将使用 4/(16),对于 3,我们将使用 3/(16 ^2),如果小数部分增加,则类似。

        例如:0xC.231p1 = (12 + 2/16 + 3/(256) + 1/(16^3)) 2^1 = 24.27392578125

        【讨论】:

          猜你喜欢
          • 2018-11-13
          • 1970-01-01
          • 2023-04-06
          • 1970-01-01
          • 2011-05-31
          • 2012-08-10
          • 1970-01-01
          • 1970-01-01
          • 2013-07-14
          相关资源
          最近更新 更多