根据文档:
浮点数字面量
...
十六进制浮点数文字由0x前缀、可选的十六进制小数和十六进制指数组成。十六进制分数由小数点后跟一系列十六进制数字组成。指数由大写或小写字符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表示,有关详细信息,请参见为什么Swift使用基数2来表示十六进制浮点数值的指数?。
Interpret 0xC.3p0
using the place value system:
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
。 - vacawama0xC.3p0 = (12*16^0 + 3*16^-1) * 2^0 = 12.1875
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