当前位置: 首页 > 面试题库 >

Swift为什么将基数2用作十六进制浮点值的指数?

楚意
2023-03-14
问题内容

根据 Swift编程语言

例如,0xFp2表示15×2 ^ 2,其值为60。类似地,0xFp-2表示15×2 ^(-2),其值为3.75。

为什么使用2作为指数的底数而不是16?我本来期望0xFp2 == 15 * (16**2)而不是0xFp2 == 15 * (2**2)


问题答案:

Swift的十六进制浮点数表示法只是C99标准为输入和输出(使用printf
%a格式)为C引入的表示法的一种变体。

该表示法的目的是使人易于理解,并使IEEE 754表示法的位易于识别。IEEE
754表示法使用基数二。因此,对于正常的浮点数,当before的数量在和p之间时,after的数量直接是IEEE
754表示形式的指数字段的值。这符合人类可读性和接近位表示的双重目标:1``2``p

$ cat t.c
#include <stdio.h>

int main(){
  printf("%a\n", 3.14);
}
$ gcc t.c && ./a.out 
0x1.91eb851eb851fp+1

0x1.91eb851eb851fp+1可以看到该数字略高于3,因为指数为1,并且有效数接近0x1.9,略高于0x1.8,这表示两个2的幂之间的正中间。

这种格式有助于记住以十进制表示的数字不一定是二进制的简单数字。在上面的示例中,3.14使用有效数字的所有数字进行近似(即使这样,也不能准确表示)。

十六进制用于表示之前的数字,该数字p与IEEE 754格式中的有效数字相对应,因为它比二进制数更紧凑。IEEE
754二进制64的有效位数需要13个十六进制数字0x1.才能完整表示,这很多,但是以二进制52位数是必需的,这坦率地说是不切实际的。

十六进制的选择实际上有其缺点:由于这种选择,对于相同数字的几个等效表示并不总是容易识别为等效的。例如,0x1.3p10x2.6p0代表相同的数字,尽管它们的数字没有共同之处。以二进制形式,这两个符号将对应于0b1.0011p10b10.011p0,这将更容易视为等效。再举一个例子,3.14也可以表示为0xc.8f5c28f5c28f8p-2,很难看到与相同的数字0x1.91eb851eb851fp+1p如您在问题中所建议的,如果表示后的数字表示16的幂,则不会出现此问题,但是当C99标准化时,表示的唯一性不是目标:接近IEEE
754表示是。



 类似资料:
  • 问题内容: 如何在Python中将以下十六进制字符串转换为float(单精度32位)? 问题答案: 在 Python 3中 : 在 Python 2中 :

  • 问题内容: 我必须将,以s 表示(例如)转换为浮点值( IEEE-754 转换)。我没有使用strconv.ParseFloat函数做到这一点。还有什么我要用的吗?到目前为止我找不到。我也尝试先将其转换为整数,然后转换为浮点数,但结果是错误的。 我最后一次尝试的代码: 问题答案: 首先,需要说明输入的位长。由于十六进制表示形式有4个字节(8个十六进制数字),因此很可能是a (需要询问者澄清)。 您

  • 我正在尝试将十六进制数据添加到十六进制字符串中,我需要使用它们的IEEE表示将浮点数添加到该字符串中。对于整数,这很简单: 其中value是数字的VARCHAR,params是包含十六进制字符串的VARCHAR。这个技巧适用于整数,但对于十进制,它会截断十进制部分,并将整数部分转换为十六进制整数。如果十进制的大小是固定的(java float或double),如何将值转换为十进制数的IEEE浮点表

  • 问题内容: 我正在查看此代码以Java 进行计算。他们为什么在某些循环中使用十六进制值,而对于变量却使用常规值?使用十六进制有什么好处? 问题答案: 因为十六进制对应的位数比十进制数更紧密。每个十六进制数字对应于4位(半字节)。因此,一旦您了解了与每个十六进制数字(0-F)相关的位掩码,就可以执行“我想要低位字节的掩码”之类的操作: 或者,“我想为低31位使用掩码”: 仅供参考:

  • 问题内容: 是否有任何(至少整数)数字以本机Swift方式在字符串中获取其十六进制表示形式?反之。它一定不能使用Foundation。例如,String类具有一个函数 它将代表整数的字符串转换为其Int值。我正在寻找类似的东西,使用十六进制字符串。我知道这很容易实现,但是如果Swift已经有了,那就更好了。否则,如果您已经对String和Int进行了扩展以实现以下目的: 我知道这不是火箭科学,但以

  • 二、浮点数转换成十进制数的步骤 该步骤与前面“十进制数转换成浮点数”的步骤是互逆的,其具体步骤如下: 1、分割数字的符号、阶码和有效数字; 2、将偏移阶码减去偏移,得到真正的阶码; 3、把数字写成规格化的二进制数形式; 4、把规格化的二进制数改变成非规格化的二进制数; 5、把非规格化的二进制数转换成十进制数。 例11.2 把协处理器中的浮点数1100000111001001000000000000