同样的方法,0.2 用单精度浮点数表示是:0.20000000298023223876953125。所以,0.1 0.2 的结果是:0.300000004470348358154296875。
7、特殊值耐心的读者看到这里,你真的很棒!但还没完哦,继续加油!
单精度浮点数的最大值讲解下一个知识点之前,请思考本文开始的一个问题:单精度浮点数的最大值是多少?
根据前面学到的知识,我们很容易想到它的最大值的内存应该表示是这样的。
即:01111111111111111111111111111111。然而我们把这个值填入 https://baseconvert.com/ieee-754-floating-point 中,发现结果是这样的:
什么?NaN 是个什么鬼?!我就是按照你上面讲过的思考的。。。
别急,因为凡是都有特殊。现在就讲讲浮点数中的特殊值。
特殊值 infinity(无穷)当指数位全是 1,尾数位全是 0 时,这样的浮点数表示无穷。根据符号位,有正无穷和负无穷( infinity 和 -infinity)。为什么需要无穷?因为计算机资源的限制,没法表示所有的数,当一个数超过了浮点数的表示范围时,就可以用 infinity 来表示。而数学中也有无穷的概念。
在 Go 语言中,通过 math 包的 func Inf(sign int) float64 函数可以获取到正负无穷。
在 Java 语言中,通过 Float 或 Double 类中的常量可以获得:Float.POSITIVE_INFINITY、Float.NEGATIVE_INFINITY。
具体表示可以定义一个常量,比如:
正无穷:0x7FF0000000000000,负无穷:0xFFF0000000000000
和上面浮点数内存位模型强转 int 类似,这个执行相反操作(类似 Float64frombits 这样的函数),就得到了这个特殊的浮点值。可以看 Go 语言 math 标准库相应函数的实现。
特殊值 NaNNaN 是 not-a-number 的缩写,即不是一个数。为什么需要它?例如,当对 -1 进行开根号时,浮点数不知道如何进行计算,就会使用 NaN,表示不是一个数。
NaN 的具体内存表示是:指数位全是 1,尾数位不全是 0。
和 infinity 类似,Go 和 Java 都定义了相应的函数或常量。
小结现在清楚上面单精度浮点数最大值是不对的了吧,它是一个 NaN。画一张图,方便你更清晰的记住这些特殊值。