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


/*

网上很多都没说清楚到底出题人是什么用意,用意就是既要又要,既要不溢出,又要不丢失精度.所以就分开处理,在丢失之前把丢失的部分保存下来,然后两部分算好再相加.

可以先看一下我的2.79题 用的是先乘后除 会溢出 符合题意

2.80要求的是先除后成 不会溢出 但会丢失精度

核心思路:按照书本上的公式除以4会导致x丢失2位使结果错误(如果先乘的话可以避免,但会导致溢出不符合题意),x=-3时 (x = x + (1 << 2) - 1)等于0,x=2时,x=x>>2;等于0.(再次强调我们先除以4所以这两个式子等于0)

所以我们在除之前先把会丢失的那两位保存到xx.

x用先除后乘,防止溢出,让它丢失后两位,当x只有2位时,丢弃后值会等于0

xx用先乘后除,因为只有两位所以不会溢出,

x+xx就是我们的答案

*/


#include <stdio.h>
#include <limits.h>
 
int threefourths(int x);
 
int main() 
{
	
	printf("3result=\t%d\n",threefourths(3));
	printf("-3result=\t%d\n",threefourths(-3));
	printf("150result=\t%d\n",threefourths(150));
	printf("-150result=\t%d\n",threefourths(-150));
	printf("-10result=\t%d\n",threefourths(-10));
	return 0;
}
 
 
int threefourths(int x)
{
	int xx = x&0x3;
	int is_neg = x & INT_MIN;
	(is_neg && (xx = ((-x)&0x3)));
	(is_neg && (x = x + (1 << 2) - 1));
	x=x>>2;
	xx=(((xx<<1)+xx)>>2);//xx只有两位先乘后除不会溢出.
	(is_neg && (xx = -xx));
	return (x<<1)+x+xx;
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值