温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java中6.6f+1.3f !过程是怎样的

发布时间:2022-01-06 16:28:51 来源:亿速云 阅读:132 作者:iii 栏目:云计算

这篇文章主要讲解了“Java中6.6f+1.3f !过程是怎样的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中6.6f+1.3f !过程是怎样的”吧!

Java中6.6f+1.3f !过程是怎样的

打印结果是:7.8999996。什么个鬼,我的程序难道是个假程序吗?

我们将 float 改为 double,在执行一下。

Java中6.6f+1.3f !过程是怎样的

结果又变了,为:7.8999998569488525。

这是为什么呢?为什么和我预期的不一样。

要说明这个问题,我们就要从计算机的底层的 0 和 1 说起。计算机只认识 0 和 1,所以所有的计算最终都会转换成二进制的计算。

float 存储原理      

CPU 表示浮点数由三部分组成 分为三个部分,符号位(sign),指数部分(exponent)和有效部分(fraction, mantissa)。 其中 float 总共占用 32 位,符号位,指数部分,有效部分各占 1 位,8 位,23 位。

Java中6.6f+1.3f !过程是怎样的

对于实数,转化为二进制分为两部分,第一部分整数部分,第二部分是小数部分。整数部分计算二进制大家都很熟悉。

Java中6.6f+1.3f !过程是怎样的

我们再看一个小数部分的计算过程。

将小数乘以2,取整数部分作为二进制的值,然后再将小数乘以2,再取整数部分,以此往复循环。

Java中6.6f+1.3f !过程是怎样的

你会发现,上面的计算过程会发生循环,循环体为 1001。所以 0.6 转化为二进制为 0.10011001…,6.6转化为二进制为 110.10011001… 无限循环。

那么计算机该如何处理小数呢?人们是非常聪明的,所以想出了“规约化”和“指数偏移值”。

规约化      

规约化,就是我们通过规约化将小数转为规约形式,类似我们用的科学计数法,就是保证小数点前面有一个有效数字。

在二进制里面,就是保证整数位是一个 1。那么 110.10011001 规约化后就为:1.1010011001*2^2

指数偏移值      

是指浮点数中指数部分的值,它的值为规约形式的指数值加上某个固定的值,float 的固定值为 127,计算方法是 2^e-1 其中的 e 为存储指数部分的比特位数,前面提到的 float 为 8 位,double 为 11 位。在这里,因为是 2 的 2 次方,偏移值就是 127+2=129,转换为二进制就是 10000001

拼接      

前面说了,采用二进制科学计数法计算浮点数的,有三个部分。符号位,指数部分,有效部。

6.6 为正数,符号位为 0,指数部分为偏移值的二进制 10000001,有效部分为规约形式的小数部分,为什么只取小数部分?因为整数肯定是 1,去掉了不会产生误差。我们去取小数的前 23 位即 10100110011001100110011,最后拼接到一起即 01000000110100110011001100110011。 同理,我们可以计算出 1.3 的浮点数为 00111111101001100110011001100110。

Java中6.6f+1.3f !过程是怎样的

感谢各位的阅读,以上就是“Java中6.6f+1.3f !过程是怎样的”的内容了,经过本文的学习后,相信大家对Java中6.6f+1.3f !过程是怎样的这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI