【发布时间】:2015-04-19 19:54:24
【问题描述】:
我不明白浮点数在 Swift 中如何以十六进制表示法表示。 Apple 的文档显示 0xC.3p0 等于十进制的 12.1875。有人可以指导我如何进行转换吗?我知道在十进制十六进制值 0xC = 12 之前。小数点后的 3p0 是我难住的地方。
【问题讨论】:
我不明白浮点数在 Swift 中如何以十六进制表示法表示。 Apple 的文档显示 0xC.3p0 等于十进制的 12.1875。有人可以指导我如何进行转换吗?我知道在十进制十六进制值 0xC = 12 之前。小数点后的 3p0 是我难住的地方。
【问题讨论】:
浮点文字
...
十六进制浮点文字由 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?
了解更多信息。
【讨论】:
使用位值系统解释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
【讨论】:
p10 代表 2^10 而不是 2^16。
为了总结我读过的内容,您可以看到这些表示如下:
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
【讨论】:
正如你所说,0xC 是 12。小数部分为((1/16)*3)*10^0。
所以你需要把小数部分除以 16。然后你需要将它乘以 2 的 p 后面的数字的幂
【讨论】:
十六进制 -(0-9,A=10,B=11,C=12,D=13,E=14,F=15) 和 p0 表示 2^0
例如:- 0xC = 12(0x 前缀代表十六进制)
在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
【讨论】: