原标题:jvm规范之浮点数 - 你知道吗,有个数字它和自身不相等
你知道吗,有个数字它和自身不相等,你知道吗,有两个数字他们是相等的,但是1.0除以他们得到的结果却是大相径庭。本文将为你揭开这神秘的面纱,并自此开启 java jvm 之旅。关注我,我接下来将持续更新 java jvm 知识 、数据结构与算法,你若关注,我必不负所望!
今天,我们说 jvm 里浮点数的表示,已经整理如下:
浮点数的表示,目前几乎都是用 IEEE754 标准,它包括了:正负数,正负0,正负无穷大,以及 NaN(Not a number),其中,NaN = 0.0f / 0.0f,NaN 是无序的,而且 NaN != NaN,本身不相等,这是唯一一例,也无法用标准形式表示。
正负 0 虽然是相等的,但是有区别,1.0 / 0.0 等于正无穷大,1.0/-0.0 等于 负无穷大。此外,正负 0 就没区别了。
现在,我们正式走进浮点数的世界,java jvm 里不只有 单精度浮点数集合,还有单精度扩展指数集合,不只有双精度浮点数集合,还有双精度扩展指数集合。但是,单、双精度扩展指数集合是可选的,而单双精度浮点数集合是必须要实现的,扩展指数集合可以代替浮点数集合。
IEEE754 标准里,一个浮点数表示为:s × m × 2^(e-N+l) 来表示,其中,s 为正负1,表示数字的符号,
m 是一个小于 2^N 的正整数, e 是一个介于 Emin=-(2^(k-1) - 2) 和 Emax=2^(K-l) - l 之间的整数,包括 Emin 和 Emax。N 与 K 的范围则取决于当前采用的浮点数集合。
对于一个数字,可能存在多组 s、m与e的值来表示,此时,可以把 m 的值减半,而 e + 1,得到另一种表示,如果某种表示里 m >= 2^(n-1),则称该表示为标准表示,如果没有,如果 m >= 2^(n-1) 不成立,则称为非标准表示,如果一个数字不存在标准表示,则称这个值为非标准值。
至于 N、K 的范围,请参考下图:
我得承认,浮点数的表示理解起来是比较吃力,我当年读大学时就不理解,如今,还是一知半解。
关注我,带你揭秘 java jvm 奥妙,成为 java 大神。记得关注 + 收藏哦,请随意评论,多谢。返回搜狐,查看更多
责任编辑: