博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《CSAPP》(第3版)答案(第五章)
阅读量:4171 次
发布时间:2019-05-26

本文共 4163 字,大约阅读时间需要 13 分钟。

《CSAPP》(第3版)答案(第五章)

P13

  • A
    图片来源:
    https://github.com/DreamAndDead/CSAPP-3e-Solutions/blob/master/chapter5/5.13.md
    图片来源:https://github.com/DreamAndDead/CSAPP-3e-Solutions/blob/master/chapter5/5.13.md,非原创
    在这里插入图片描述
  • B
    3.0
  • C
    1.0
  • D
    只在关键路径上进行浮点数加法

P14

  • A
    每个元素需要六次长整型或浮点数加法,一共n/6个元素,所以是6*n/6=n次长整型或浮点数加法。CPE下限1.0
  • B
    与A同理

P15

void inner4(vec_ptr u, vec_ptr v, data_t *dest) {
long i; long length = vec_length(u); data_t *udata = get_vec_start(u); data_t *vdata = get_vec_start(v); data_t sum = (data_t) 0; data_t sum1 = (data_t) 0; data_t sum2 = (data_t) 0; data_t sum3 = (data_t) 0; data_t sum4 = (data_t) 0; data_t sum5 = (data_t) 0; for (i = 0; i < length-6; i+=6) {
sum = sum + udata[i] * vdata[i]; sum1 = sum1 + udata[i+1] * vdata[i+1]; sum2 = sum2 + udata[i+2] * vdata[i+2]; sum3 = sum3 + udata[i+3] * vdata[i+3]; sum4 = sum4 + udata[i+4] * vdata[i+4]; sum5 = sum5 + udata[i+5] * vdata[i+5]; } for(; i < length; i++) {
sum = sum + udata[i] * vdata[i]; } *dest = sum + sum1 + sum2 + sum3 + sum4 + sum5;}

限制性能的因素:我也不知道

P16

void inner4(vec_ptr u, vec_ptr v, data_t *dest) {
long i; long length = vec_length(u); data_t *udata = get_vec_start(u); data_t *vdata = get_vec_start(v); data_t sum = (data_t) 0; for (i = 0; i < length-6; i+=6) {
sum = sum + ( udata[i] * vdata[i] + udata[i+1] * vdata[i+1] + udata[i+2] * vdata[i+2] + udata[i+3] * vdata[i+3] + udata[i+4] * vdata[i+4] + udata[i+5] * vdata[i+5] ); } for(; i < length; i++) {
sum = sum + udata[i] * vdata[i]; } *dest = sum;}

P17

#include 
#include
#include
#include
#include
void* basic_memset(void *s, int c, size_t n) {
size_t cnt = 0; unsigned char *schar = s; while (cnt < n) {
*schar++ = (unsigned char) c; cnt++; } return s;}void* effective_memset(void *s, unsigned long cs, size_t n) {
size_t K = sizeof(unsigned long); size_t cnt = 0; unsigned char *schar = s; while (cnt < n) {
if ((size_t)schar % K == 0) {
break; } *schar++ = (unsigned char)cs; cnt++; } unsigned long *slong = (unsigned long *)schar; size_t rest = n - cnt; size_t loop = rest / K; size_t tail = rest % K; for (size_t i = 0; i < loop; i++) {
*slong++ = cs; } schar = (unsigned char *)slong; for (size_t i = 0; i < tail; i++) {
*schar++ = (unsigned char)cs; } return s;}

P18

#include 
double poly(double a[], double x, long degree) {
long i; double result = a[0]; double xpwr = x; for (i = 1; i <= degree; i++) {
result += a[i] * xpwr; xpwr = x * xpwr; } return result;}double poly_6_3a(double a[], double x, long degree) {
long i = 1; double result = a[0]; double result1 = 0; double result2 = 0; double xpwr = x; double xpwr1 = x * x * x; double xpwr2 = x * x * x * x * x; double xpwr_step = x * x * x * x * x * x; for (; i <= degree - 6; i+=6) {
result = result + (a[i]*xpwr + a[i+1]*xpwr*x); result1 = result1 + (a[i+2]*xpwr1 + a[i+3]*xpwr1*x); result2 = result2 + (a[i+4]*xpwr2 + a[i+5]*xpwr2*x); xpwr *= xpwr_step; xpwr1 *= xpwr_step; xpwr2 *= xpwr_step; } for (; i <= degree; i++) {
result = result + a[i]*xpwr; xpwr *= x; } return result + result1 + result2;}double polyh(double a[], double x, long degree) {
long i; double result = a[degree]; for (i = degree-1; i >= 0; i--) {
result = a[i] + x*result; } return result;}

P19

#include 
#include
void psum1a(float a[], float p[], long n) {
long i; float last_val, val; last_val = p[0] = a[0]; for (i = 1; i < n; i++) {
val = last_val + a[i]; p[i] = val; last_val = val; }}void psum_4_1a(float a[], float p[], long n) {
long i; float val, last_val; float tmp, tmp1, tmp2, tmp3; last_val = p[0] = a[0]; for (i = 1; i < n - 4; i++) {
tmp = last_val + a[i]; tmp1 = tmp + a[i+1]; tmp2 = tmp1 + a[i+2]; tmp3 = tmp2 + a[i+3]; p[i] = tmp; p[i+1] = tmp1; p[i+2] = tmp2; p[i+3] = tmp3; last_val = last_val + (a[i] + a[i+1] + a[i+2] + a[i+3]); } for (; i < n; i++) {
last_val += a[i]; p[i] = last_val; }}

第五章 完

转载地址:http://tywai.baihongyu.com/

你可能感兴趣的文章
嵌入式100题(70):一个程序从开始运行到结束的完整过程(四个过程)
查看>>
嵌入式100题(71):什么是堆,栈,内存泄漏和内存溢出?
查看>>
嵌入式100题(73):死锁的原因、条件 创建一个死锁,以及如何预防
查看>>
嵌入式100题(60):系统调用的作用
查看>>
C语言基本概念归纳
查看>>
初识单片机
查看>>
在单片机上点亮LED
查看>>
初学定时器
查看>>
数码管
查看>>
单片机数码管消隐及中断
查看>>
C#串口调试助手代码
查看>>
学习DS1820随记
查看>>
初学C#之windowes窗口应用文件
查看>>
linux常用命令
查看>>
Linux之vim(一)vim简介
查看>>
进程间通信的方式简单解析————管道
查看>>
git学习笔录
查看>>
Activity类中7个与活动生命周期回调有关的方法
查看>>
jwt与token+redis,哪种方案更好用?
查看>>
Comparator接口
查看>>