通过C中的逐位表示比较2个浮点



我在考试中遇到了这个问题,但我真的无法解决,我将感谢你的帮助。

只填充空格,函数必须返回true当且仅当x<y假设x,y不能是NaN(但可以是+-inf(不允许强制转换,只使用ux,uy,sx,sy

bool func(float x, float y) {
unsigned* uxp = ______________ ;
unsigned* uyp = ______________ ;
unsigned  ux  = *uxp;
unsigned  uy  = *uyp;
unsigned  sx = (ux>>31); 
unsigned  sy = (uy>>31);
return ___________________________;
}

假定float使用IEEE-754二进制32,unsigned为32位。

使用unsigned类型对float对象进行别名是不合适的,尽管一些C实现支持它。相反,您可以创建一个复合文字并集,用float值初始化其float成员,并访问其unsigned成员。(这是由C标准支持的,但不是由C++支持的。(

在那之后,这只是一个根据符号位将比较划分为不同情况的问题:

#include <stdbool.h>
bool func(float x, float y) {
unsigned* uxp = & (union { float f; unsigned u; }) {x} .u;
unsigned* uyp = & (union { float f; unsigned u; }) {y} .u;
unsigned  ux  = *uxp;
unsigned  uy  = *uyp;
unsigned  sx = (ux>>31); 
unsigned  sy = (uy>>31);
return
sx &&  sy ? uy < ux :  // Negative values are in "reverse" order.
sx && !sy ? (uy | ux) & 0x7fffffffu : // Negative x is always less than positive y except for x = -0 and y = +0.
!sx &&  sy ?    0    :  // Positive x is never less than negative y.
ux < uy ;  // Positive values are in "normal" order.
}

#include <stdio.h>

int main(void)
{
// Print expected values and function values for comparison.
printf("1, %dn", func(+3, +4));
printf("1, %dn", func(-3, +4));
printf("0, %dn", func(+3, -4));
printf("0, %dn", func(-3, -4));
printf("0, %dn", func(+4, +3));
printf("1, %dn", func(-4, +3));
printf("0, %dn", func(+4, -3));
printf("1, %dn", func(-4, -3));
}

样本输出:

1,11,10,00,00,01,10,01,1

最新更新