我在考试中遇到了这个问题,但我真的无法解决,我将感谢你的帮助。
只填充空格,函数必须返回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