16 | 浮点数和定点数(下):深入理解浮点数到底有什么用?
徐文浩
该思维导图由 AI 生成,仅供参考
上一讲,我们讲了用“浮点数”这样的数据形式,来表示一个不能确定大小的数据范围。浮点数可以大到 ,也可以小到 这样的数值。同时,我们也发现,其实我们平时写的 0.1、0.2 并不是精确的数值,只是一个近似值。只有 0.5 这样,可以表示成 这种形式的,才是一个精确的浮点数。
你是不是感到很疑惑,浮点数的近似值究竟是怎么算出来的?浮点数的加法计算又是怎么回事儿?在实践应用中,我们怎么才用好浮点数呢?这一节,我们就一起来看这几个问题。
浮点数的二进制转化
我们首先来看,十进制的浮点数怎么表示成二进制。
我们输入一个任意的十进制浮点数,背后都会对应一个二进制表示。比方说,我们输入了一个十进制浮点数 9.1。那么按照之前的讲解,在二进制里面,我们应该把它变成一个“符号位 s+ 指数位 e+ 有效位数 f”的组合。第一步,我们要做的,就是把这个数变成二进制。
首先,我们把这个数的整数部分,变成一个二进制。这个我们前面讲二进制的时候已经讲过了。这里的 9,换算之后就是 1001。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了浮点数的表示、转化和加法计算,以及在实践应用中可能出现的精度损失问题。首先介绍了浮点数的二进制转化过程,详细解释了如何将十进制浮点数表示成二进制形式,并通过实例说明了浮点数的近似值是如何计算出来的。接着,阐述了浮点数的加法计算原理,强调了先对齐、再计算的重要性,并指出了在加法过程中可能出现的精度损失情况。最后,通过一个简单的Java程序展示了在实际计算中,由于精度损失,即使加上一个较小的数,结果也可能完全不会变化。文章还介绍了Kahan Summation算法,用以解决浮点数加法中可能存在的精度损失问题。总结指出,浮点数在实践应用中存在精度损失,因此对于需要精确数值的情况,如银行存款、电商交易,建议使用定点数或整数类型。而浮点数更适合不需要非常精确计算结果的情况。最后,鼓励读者深入理解计算机问题的基本原理,以便在特定问题下找到可行解决方案。整体而言,本文通过深入浮点数的内部表示和加法计算原理,帮助读者更好地理解了浮点数在计算机中的应用,并引发了对浮点数精度问题的思考。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入浅出计算机组成原理》,新⼈⾸单¥68
《深入浅出计算机组成原理》,新⼈⾸单¥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-06516 - 有米decimal是如何实现保证不丢精度呢?2019-05-311033
- 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-13125
- DreamItPossible课后思考题解答: 首先,64位浮点数的表示方法如下:符号位是1位,指数部分为11位,尾数部分为52位; 其次,应用本节的可知,当做加法的两个64位的浮点数的指数位相差52位后,较小的那个数就会因为要右移53位导致有效位数完全丢失; 最后,精度缺失问题同样可以使用`Kahan Summation`算法来补偿;2019-08-1525
- Junho老师好。平时会听说一种说法:在现代CPU下,定点数的执行效率比浮点数慢一到两个数量级。不知这个说法是否合理?如果合理的话,原理是什么呢? 对于这两种表示法,在工作中的应用:游戏中涉及要求计算一致性的场合,如王者荣耀的网络同步方案。 王者的同步方案是帧同步,在这个方案下,需要确保逻辑层的所有计算,在所有硬件下都是完全一致的,否则同步就会出现灾难性的后果。 据找得到的资料,王者官方的分享是说,他们是用分数来代替浮点数的(分子和分母分别用整数表示),但没提及不用定点数的缘由。 倒是腾讯另外某位技术专家,就提及了浮点数与定点数在执行效率上的差异,但没涉及原理说明,所以想请教一下老师这个问题。谢谢!2019-06-20412
- 有铭decimal难道就是所谓定点数?Java里的BigDecimal的原理是什么?2019-05-319
- 初心丶可曾記64位浮点数,有效位是52位,所以相差2^53会丢失较小的数2019-05-317
- 逍遥思对Kahan Summation算法的理解: x,本轮要加的数 第一个c,截止上一轮损失的精度 第二个c,截止本轮损失的精度 y,本轮要加的数与之前累计损失的精度之和 前两个sum,上一轮的求和结果 t和第三个sum,本轮的求和结果2019-06-1614
- humor对于64位的符点数,符号位是52位,所以应该是如果两个相差2^53倍及以上的数相加,较小的数会完全丢失吧。2019-05-314
- 小木匠老师,在Kahan 算法里,如果累积的损失精度c也不能达到1600万的条件,是不是也就不能被累加呢?比如做1亿6千万零9次加1计算,这9次是不是也就加不上了呢2019-06-143
收起评论