float32
的精度是小数点后面 6
位,这个我没说错吧。。(万一我记错了请批我)
那么我的理解就是把 float32
的 10000018
表示成科学计数法就应该是:1.000002e+07
(四舍五入了)
但是 go 输出的结果是:1.0000018e+07,代码如下
package main
import "fmt"
var num float32 = 10000018 // 8 位 <==> 1.0000018 * 10^7
func main() {
fmt.Println("num: ", num) // 1.0000018e+07 ??小数点后面怎么有 7 位
}
小数点后面怎么有 7 位?和我预想的不一样。。
并且我把 10000018 加个 7 得到 100000187 然后再试一次,又变成小数点后 8 位了,代码如下:
package main
import "fmt"
//var myfloat float32 = 10000018 // 8 位 <==> 1.0000018 * 10^7
var myfloat float32 = 100000182 // 9 位 <==> 1.00000182 * 10^8
var ans float32 = 100000187 // 9 位 <==> 1.00000187 * 10^8
func main() {
fmt.Println("myfloat: ", myfloat) // 1.00000184e+08
fmt.Println(myfloat == myfloat + 1) // true
fmt.Println("myfloat: ", myfloat+5) // 1.0000019e+08
fmt.Println(ans == myfloat+5) // false
}
1.00000184e+08 这个数有 8 个小数,我不太懂了。。
关于 IEEE-754 的介绍我也看了,还是有疑惑。
求大神指教。
不好意思,是我愚昧了,脑子没转过来。
我现在懂了,以后一定好好阅读文献,不马虎了。
1
InkStone 2020-07-02 19:14:55 +08:00
你是怎么做到看了 IEEE754 还能把 float 理解成”小数点后保留六位小数“的?
float 按二进制取整,输出成十进制有几位小数纯看运气和输出格式 |
2
reus 2020-07-02 19:18:52 +08:00
知道浮点数为啥叫“浮点”数吗?
就是小数点位置是不固定的,所以你一开始就错了 |
3
1010543618 2020-07-02 19:33:29 +08:00
计算机组成原理忘得差不多了
随便找了个介绍 https://www.runoob.com/w3cnote/32-float-storage.html,貌似规格化之后能有 24 bit (16777216) 的精度 |
4
ipwx 2020-07-02 19:54:05 +08:00
1.00000184e+08 这个数有 8 个小数:
楼主你真的看了浮点数标准么? ---- 首先 3L 给了你一个资料了,32 位浮点数的底数最多能有 24 bit,也就是最多八位( 2**24 = 16777216 )。剩下 8 位是指数,所以指数最多是 e128 这个量级。和小数点以后到底多少位根本没有关系,看的是指数和底数的有效数位。 |