深入浅出计算机组成原理
徐文浩
bothub 创始人
70432 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 62 讲
深入浅出计算机组成原理
15
15
1.0x
00:00/00:00
登录|注册

16 | 浮点数和定点数(下):深入理解浮点数到底有什么用?

课后思考
推荐阅读
总结延伸
Kahan Summation算法
浮点数的加法和精度损失
浮点数的二进制转化
深入理解浮点数

该思维导图由 AI 生成,仅供参考

上一讲,我们讲了用“浮点数”这样的数据形式,来表示一个不能确定大小的数据范围。浮点数可以大到 ,也可以小到 这样的数值。同时,我们也发现,其实我们平时写的 0.1、0.2 并不是精确的数值,只是一个近似值。只有 0.5 这样,可以表示成 这种形式的,才是一个精确的浮点数。
你是不是感到很疑惑,浮点数的近似值究竟是怎么算出来的?浮点数的加法计算又是怎么回事儿?在实践应用中,我们怎么才用好浮点数呢?这一节,我们就一起来看这几个问题。

浮点数的二进制转化

我们首先来看,十进制的浮点数怎么表示成二进制。
我们输入一个任意的十进制浮点数,背后都会对应一个二进制表示。比方说,我们输入了一个十进制浮点数 9.1。那么按照之前的讲解,在二进制里面,我们应该把它变成一个“符号位 s+ 指数位 e+ 有效位数 f”的组合。第一步,我们要做的,就是把这个数变成二进制。
首先,我们把这个数的整数部分,变成一个二进制。这个我们前面讲二进制的时候已经讲过了。这里的 9,换算之后就是 1001。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了浮点数的表示、转化和加法计算,以及在实践应用中可能出现的精度损失问题。首先介绍了浮点数的二进制转化过程,详细解释了如何将十进制浮点数表示成二进制形式,并通过实例说明了浮点数的近似值是如何计算出来的。接着,阐述了浮点数的加法计算原理,强调了先对齐、再计算的重要性,并指出了在加法过程中可能出现的精度损失情况。最后,通过一个简单的Java程序展示了在实际计算中,由于精度损失,即使加上一个较小的数,结果也可能完全不会变化。文章还介绍了Kahan Summation算法,用以解决浮点数加法中可能存在的精度损失问题。总结指出,浮点数在实践应用中存在精度损失,因此对于需要精确数值的情况,如银行存款、电商交易,建议使用定点数或整数类型。而浮点数更适合不需要非常精确计算结果的情况。最后,鼓励读者深入理解计算机问题的基本原理,以便在特定问题下找到可行解决方案。整体而言,本文通过深入浮点数的内部表示和加法计算原理,帮助读者更好地理解了浮点数在计算机中的应用,并引发了对浮点数精度问题的思考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入浅出计算机组成原理》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(62)

  • 最新
  • 精选
  • 老师 ,这里我用 JS 代码实验了一下,JS 中的数值类型都是 IEEE754实现的浮点数类型: let a = 20000000; let b = 1; let c = a + b; console.log("c is " + c); let d = c - a; console.log("d is " + d); 输出是: // "c is 20000001" // "d is 1" 然后2千万个数相加: let result = 0; for (let j = 0; j < 20000000; j++) { result ++; }; console.log('result', result) // result 20000000 这里都是正确的,是 自己实现了 Kahan Summation 算法吗 ? 还是其他的原因?

    作者回复: 因为js里面你用的是64位的float啦,所以精度不再是1600万分之1了,你可以自己看看64位的精度应该是多少,试试看是不是有一样的问题。

    2019-06-06
    5
    16
  • 有米
    decimal是如何实现保证不丢精度呢?
    2019-05-31
    10
    33
  • Wayne
    总感觉文中Kahan Summation代码的物理意义有点难以理解,写了个一个相对好一点理解的版本,仅供参考哈~ public static void main(String[] args) { float res = 0.0f; float remain = 0.0f; for (int i = 0; i < 20000000; i++) { float cur = 1.0f; float needToAdd = cur + remain; float nextRes = res + needToAdd; remain = needToAdd - (nextRes - res); res = nextRes; } System.out.println(res); }
    2020-05-13
    1
    25
  • DreamItPossible
    课后思考题解答: 首先,64位浮点数的表示方法如下:符号位是1位,指数部分为11位,尾数部分为52位; 其次,应用本节的可知,当做加法的两个64位的浮点数的指数位相差52位后,较小的那个数就会因为要右移53位导致有效位数完全丢失; 最后,精度缺失问题同样可以使用`Kahan Summation`算法来补偿;
    2019-08-15
    25
  • Junho
    老师好。平时会听说一种说法:在现代CPU下,定点数的执行效率比浮点数慢一到两个数量级。不知这个说法是否合理?如果合理的话,原理是什么呢? 对于这两种表示法,在工作中的应用:游戏中涉及要求计算一致性的场合,如王者荣耀的网络同步方案。 王者的同步方案是帧同步,在这个方案下,需要确保逻辑层的所有计算,在所有硬件下都是完全一致的,否则同步就会出现灾难性的后果。 据找得到的资料,王者官方的分享是说,他们是用分数来代替浮点数的(分子和分母分别用整数表示),但没提及不用定点数的缘由。 倒是腾讯另外某位技术专家,就提及了浮点数与定点数在执行效率上的差异,但没涉及原理说明,所以想请教一下老师这个问题。谢谢!
    2019-06-20
    4
    12
  • 有铭
    decimal难道就是所谓定点数?Java里的BigDecimal的原理是什么?
    2019-05-31
    9
  • 初心丶可曾記
    64位浮点数,有效位是52位,所以相差2^53会丢失较小的数
    2019-05-31
    7
  • 逍遥思
    对Kahan Summation算法的理解: x,本轮要加的数 第一个c,截止上一轮损失的精度 第二个c,截止本轮损失的精度 y,本轮要加的数与之前累计损失的精度之和 前两个sum,上一轮的求和结果 t和第三个sum,本轮的求和结果
    2019-06-16
    1
    4
  • humor
    对于64位的符点数,符号位是52位,所以应该是如果两个相差2^53倍及以上的数相加,较小的数会完全丢失吧。
    2019-05-31
    4
  • 小木匠
    老师,在Kahan 算法里,如果累积的损失精度c也不能达到1600万的条件,是不是也就不能被累加呢?比如做1亿6千万零9次加1计算,这9次是不是也就加不上了呢
    2019-06-14
    3
收起评论
显示
设置
留言
62
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部