深入理解计算机系统 家庭作业 2.84

发布于:2024-04-06 ⋅ 阅读:(158) ⋅ 点赞:(0)

这题没有这个要求`所以可以用 ? > : < 这种运算

以下代码用的是位级运算.因为我误解了题意 呜呜呜 想看用判断的代码请自行百度

((((ux<<9>>9)<<((ux<<1>>24)-127)) ((uy<<9>>9)<<((uy<<1>>24)-127)))>>31);

原理是IEEE754,我解释一下这行代码:

(ux<<9>>9)是x的尾数Mx 

((ux<<1>>24)-127))是x的e-Bias 也就是阶码Ex

Mx<<Ex就是M*2^{E} 

ux和uy这两个值的M*2^{E} 相减 得到的差值再右移31位得到符号(得到result),也就是差值的正负

此时ux和uy如果是正数,就返回result,如果是负数,就返回!result 

严格来说是符合题意的,因为result里面只用到了ux uy 

#include <stdio.h>

int float_le(float x,float y);
unsigned f2u(float x) ;

int main() 
{
	printf("result = %d\n",float_le(1.1,2.2));
	printf("result = %d\n",float_le(3.1,2.2));
	printf("result = %d\n",float_le(-1.1,-1.2));
	return 0;
}

int float_le(float x,float y) 
{
	unsigned ux = f2u(x) ;
	unsigned uy = f2u(y) ;
	
	unsigned sx = ux >> 31 ;
	unsigned sy = uy >> 31 ;
	printf("ux = %x\n",ux);
	printf("expx = %x\n",(ux<<1>>24));
	printf("expx-127 = %d\n",(ux<<1>>24)-127);
	printf("Mx = %x\n",(ux<<9>>9));
	printf("expx*mx = %x\n",((ux<<9>>9)<<((ux<<1>>24)-127)));
	printf("uy = %x\n",uy);
	printf("expx = %x\n",(uy<<1>>24));
	printf("expy-127 = %d\n",(uy<<1>>24)-127);
	printf("My = %x\n",(uy<<9>>9));
	printf("expy*my = %x\n",((uy<<9>>9)<<((uy<<1>>24)-127)));
	int result=((((ux<<9>>9)<<((ux<<1>>24)-127))-((uy<<9>>9)<<((uy<<1>>24)-127)))>>31);
	
	return (ux==uy)||(sx==1&&sy==0)||(sx==0&&sy==0&&!result)||(sx==1&&sy==1&&!result);
}

unsigned f2u(float x) 
{
    return *(unsigned *)&x;
}


网站公告

今日签到

点亮在社区的每一天
去签到