C代码解释
以下函数用于比较两个浮点值,但在某些特定情况下比常规比较快(例如在Cortex-A8上)C代码解释,c,C,以下函数用于比较两个浮点值,但在某些特定情况下比常规比较快(例如在Cortex-A8上) 有人能解释一下它到底是如何工作的吗?这段代码利用了IEEE 754格式的浮点数结构。该结构本身是专门为此类操作设计的,以便快速进行比较操作 每个单精度IEEE 754编号有三个部分(从MSB到LSB的顺序): 符号位 指数部分(8位) 尾数的有效位(23位) f1大于f2如果: f1为正,f2为负 f1和f2均为正值,但f1的指数大于f2 f1和f2均为正值,指数相同,但f1的有效位大于f2 前两个i
有人能解释一下它到底是如何工作的吗?这段代码利用了IEEE 754格式的浮点数结构。该结构本身是专门为此类操作设计的,以便快速进行比较操作 每个单精度IEEE 754编号有三个部分(从MSB到LSB的顺序):
- 符号位
- 指数部分(8位)
- 尾数的有效位(23位)
f1
大于f2
如果:
为正,f1
为负f2
和f1
均为正值,但f2
的指数大于f1
f2
和f1
均为正值,指数相同,但f2
的有效位大于f1
f2
- 前两个if
和f1
的相反值为负值f2
i1 = *(int*)f1; // reading float as integer
i2 = *(int*)f2; // reading float as integer
这个函数使用了一个事实,即在大多数32位系统上,sizeof(int)==sizeof(float)
将浮点数读入规则的有符号整数变量
t1 = i1 >> 31;
这个函数提取f1
的符号位。如果f1
为负值,其MSB将为1
,因此i1
将为负值。将其向右移动31位将保留符号,因此如果i1
为负t1
将所有位设置为1
(等于-1)。如果f1
为正,其符号位将为0
,最后t1
将等于0
i1 = (i1 ^ t1) + (t1 & 0x80000001);
如果符号位为1
,如果f1
为负数,该行将执行到2的补码表示的转换
t2 = i2 >> 31;
i2 = (i2 ^ t2) + (t2 & 0x80000001);
下面是它的工作原理:如果f1
为正,那么t1
为0
,(i1^t1)
将为i1
,(t1&0x8000001)
将为0
,最后i1
将保留其原始值。如果f1
为负,则t1
将所有位设置为1
,RHS上的第一个表达式将是i1
的位反转,第二个表达式将等于0x8000001
。这样,i1
将转换为其位反转,并添加1
。但这将导致一个正数,因为MSB将被清除,这就是为什么还要添加0x8000000
以保持该数字为负数
t2 = i2 >> 31;
i2 = (i2 ^ t2) + (t2 & 0x80000001);
对f2执行与上述相同的操作
return i1 > i2;
只需比较得到的两个有符号整数。大多数CPU都有专用的指令来在硬件中执行有符号比较。此代码利用IEEE 754格式的浮点数字结构。该结构本身是专门为此类操作设计的,以便快速进行比较操作 每个单精度IEEE 754编号有三个部分(从MSB到LSB的顺序):
- 符号位
- 指数部分(8位)
- 尾数的有效位(23位)
f1
大于f2
如果:
为正,f1
为负f2
和f1
均为正值,但f2
的指数大于f1
f2
和f1
均为正值,指数相同,但f2
的有效位大于f1
f2
- 前两个if
和f1
的相反值为负值f2
i1 = *(int*)f1; // reading float as integer
i2 = *(int*)f2; // reading float as integer
这个函数使用了一个事实,即在大多数32位系统上,sizeof(int)==sizeof(float)
将浮点数读入规则的有符号整数变量
t1 = i1 >> 31;
这个函数提取f1
的符号位。如果f1
为负值,其MSB将为1
,因此i1
将为负值。将其向右移动31位将保留符号,因此如果i1
为负t1
将所有位设置为1
(等于-1)。如果f1
为正,其符号位将为0
,最后t1
将等于0
i1 = (i1 ^ t1) + (t1 & 0x80000001);
如果符号位为1
,如果f1
为负数,该行将执行到2的补码表示的转换
t2 = i2 >> 31;
i2 = (i2 ^ t2) + (t2 & 0x80000001);
下面是它的工作原理:如果f1
为正,那么t1
为0
,(i1^t1)
将为i1
,(t1&0x8000001)
将为0
,最后i1
将保留其原始值。如果f1
为负,则t1
将所有位设置为1
,RHS上的第一个表达式将是i1
的位反转,第二个表达式将等于0x8000001
。这样,i1
将转换为其位反转,并添加1
。但这会让你很沮丧