Fra*_*itt 7 floating-point swift
根据Swift编程语言:
例如,0xFp2表示15⨉2^ 2,其值为60.类似地,0xFp-2表示15⨉2^( - 2),其值为3.75.
为什么2用作指数的基数而不是16?我本来期待的0xFp2 == 15 * (16**2)不是0xFp2 == 15 * (2**2)
Pas*_*uoq 11
Swift的浮点数的十六进制表示法只是C99标准中输入和输出(使用printf %a格式)为C引入的符号的变体.
该符号的目的是易于被人类解释并且让IEEE 754表示的比特在某种程度上可识别.IEEE 754表示使用基数2.因此,对于正常的浮点数,当前面的数字在和p之间时,后面的数字直接是IEEE 754表示的指数字段的值.这符合人类可读性和与位表示的紧密性的双重目标:12p
$ cat t.c
#include <stdio.h>
int main(){
printf("%a\n", 3.14);
}
$ gcc t.c && ./a.out
0x1.91eb851eb851fp+1
Run Code Online (Sandbox Code Playgroud)
0x1.91eb851eb851fp+1可以看出数字略高于3,因为指数是1和有效数接近0x1.9,略高于0x1.8,这表示两个2的幂之间的确切中间.
这种格式有助于记住具有十进制紧凑表示的数字在二进制中不一定简单.在上面的示例中,3.14使用有效数字的所有数字来近似(即使如此,它也没有准确表示).
十六进制用于前面的数字p,它对应于IEEE 754格式的有效数字,因为它比二进制更紧凑.IEEE 754二进制64号的有效位数需要13个十六进制数字0x1.才能完全表示,这很多,但是需要二进制52位,这是坦率的不切实际的.
十六进制的选择实际上有其缺点:由于这种选择,相同数字的几个等价表示并不总是容易识别为等价.例如,0x1.3p1并且0x2.6p0代表相同的数字,尽管它们的数字没有任何共同之处.在二进制中,两个符号将对应于0b1.0011p1和0b10.011p0,这将更容易被视为等效.再举一个例子,3.14也可以表示为0xc.8f5c28f5c28f8p-2,这很难看作同一个数字0x1.91eb851eb851fp+1.p正如你在问题中所建议的那样,如果代表16的幂之后的数字不存在这个问题,但是当C99被标准化时,表示的单一性并不是一个目标:接近IEEE 754表示.
| 归档时间: |
|
| 查看次数: |
805 次 |
| 最近记录: |