本文主要是介绍深入理解计算机系统 家庭作业 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;
}
这篇关于深入理解计算机系统 家庭作业 2.80的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!