Python 为什么趋近于零的数字会表示成 5.96046448e-08

2019-12-17 21:12:35 +08:00
 xjx0524

也可能是 numpy 或 tensorflow 等库的问题。

起因:tensorflow 训练出现 loss nan,一步步 debug 到一个 sigmoid 函数结果出现了负数,打印出来发现负数全是 -5.96046448e-08,这个数值正负都有

直接搜索了这个数字,大部分结果都是计算结果里出现了这个数字,计算的逻辑应该是等于 0 的(比如矩阵和逆矩阵相乘)

所以有了这个问题,搜索无果,求助一下

4851 次点击
所在节点    Python
9 条回复
gowa
2019-12-17 21:28:18 +08:00
看一下 python 在 c 层面是如何表示浮点数的 不谢
gowa
2019-12-17 21:30:11 +08:00
jinliming2
2019-12-17 22:17:40 +08:00
double 和 float 没有办法准确表示部分小数的
yujincheng08
2019-12-17 22:25:32 +08:00
浮点数误差
skies457
2019-12-17 22:49:03 +08:00
试试 6e18 + 2000 - 6e18
Xs0ul
2019-12-17 22:51:58 +08:00
这个数是 2^-24, 是 half 能表示的最小正数
xjx0524
2019-12-18 11:02:53 +08:00
@Xs0ul 请问下 half 指的是什么呢? float16 吗?
xjx0524
2019-12-18 11:18:20 +08:00
@gowa
@jinliming2
@yujincheng08
@skies457
看了一下 754 浮点数标准,再请问下
1、python 下为什么对一个浮点数 getsizeof 是 24 呢
2、怎么在 python 里方便的看一个浮点数的二进制表示
3、还是没有想明白,sigmoid 函数怎么溢出出来负数了
aloxaf
2019-12-18 19:09:15 +08:00
浮点数在计算机中的表示是不精确的, 很容易被坑到
5.96046448e-08 是半浮点类型能表示的最小的正值

可以执行 `print(f'{np.nextafter(np.float16(0), np.float16(1))}')` 验证一下

1. sys.getsizeof 是查看对象大小,Python 不是零成本抽象语言,对象还包含了其他元信息。还有请区分 float 和 np.float,前者是 Python 内置浮点类型,后者是 numpy 的默认浮点类型。你的语境里应该一直是指 numpy。
2. 没啥好方法,毕竟浮点数的二进制表示一般也没啥用。一般都是先强转成整数再查看整数的二进制表示,比如 `bin(ctypes.c_int32.from_buffer(ctypes.c_float(1.0)).value)`
3. 不, 这是 0. 或者说你当成 0 就行了...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/629937

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX