深入理解计算机系统 CSAPP 小结暨第一次线上研讨会

基本情况

共读总人数:69人(静默组:10人)
第一次线上研讨会实到:35 人(24人未到)
研讨会时间:21:08~22: 50
最优分享:第四组(422474744424464424432 12/21)

第 1-2 周打卡和心得体会回顾

第 1、2 周打卡情况

第一周

第一组:2人未打卡
静默组:1人未打卡

第二周

第三组:1人未打卡
第四组:1人未打卡
第五组:1人未打卡
静默组:3人未打卡

心得体会

  1. 【第 1 周】深入理解计算机系统共读心得体会
  2. 【第 2 周】深入理解计算机系统共读心得体会

YouTube 视频回看

研讨会基本流程

  1. 分享者必须准备演讲稿(Slides/PPT)
  2. 研讨会基本流程(耗时:约2小时)
  • 分享环节:
    • 从1-7组依次轮流进行分享,时长5~10分钟
    • 每个分享结束后最多3个提问,时长5分钟以内;(大概60~90分钟)
    • 全体参与研讨:20分钟
    • 评选最优:10分钟
  1. 会议时间:21点~23点

研讨主题分享

  1. 浮点数杂谈
  2. 文件和二进制文件
  3. 工作中的浮点数
  4. 15 张图带你深入理解浮点数
  5. 无符号数的减法操作是如何实现的?
  6. 浮点数「精度有问题,尽量别用」的讨论,除了涉及到金钱不使用浮点数,其他情况并没有限制,「精度控制从来就不是用什么数据类型的问题」

自由分享交流

  1. 看书时间一般是在早上(晚上看不动);
  2. 先对自己提问,然后再带着问题去书中找答案;
  3. 不要一上来就直接看书,或者一直死看书;
  4. 可以看看 Bilibili CMU 视频课程
  5. 一定要做练习题;
  6. 实验题能否组织刷一波?

线上研讨会小结

  1. 主题分享普遍反馈有收获
  2. 自由交流环节:积极性欠佳
  3. 投票环节:方式不佳,准备不足(应该提前准备好投票二维码或者链接)

浮点数杂谈

来自于第 2 组

文件和二进制文件

来自第 3 组

工作中的浮点数

来自第 4 组

资料

无符号数的减法操作是如何实现的?

来自第 5 组

参考链接

浮点数相关

来自第 7 组

问题

package main

import "fmt"

func main() {
	var a float32
	a = 0.28
	fmt.Printf("%032.23f\n", a)
	// output: 00000000.28000000119209289550781
}

问题

浮动类型在表示 0.1 0.2 等小数时存在精度问题

0.1(10) = 0.00011001100…(2)
0.2(10) = 0.00110011001…(2)

如何精确的计算小数?


相关的 issue


decimal 包

一个解决浮点类型精确度问题的 Golang 包

通过 Go 定点算术运算来避免精度问题


什么是定点数

通过整数和缩放因子来表示小数

0.2 = 2 * 10^(-1)


结构体概述

type Decimal struct {
  value *big.Int
  exp int32
}

3.14 会被表示为: 314*10^(-2)

value: 314
exp: -2

exp 表示 10 的 -2 次方中的 -2


加法

0.2 + 0.34

初始状态: 2*10^(-1) + 34*10^(-2)

缩放差异: diff = abs((-1) - (-2)) = 1

缩放差异值: s = 10^(diff) = 10

统一缩放:

∵  -2 < -1
∴  2*10^(-1) = 2*s*10^(-1-diff)
∴  20*10^(-2) + 34*10^(-2)
∴  (20 + 34) * 10^(-2)

参考

演示工具