V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
xjx0524
V2EX  ›  Python

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

  •  
  •   xjx0524 ·
    xjx0524 · 2019-12-17 21:12:35 +08:00 · 4956 次点击
    这是一个创建于 1804 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    9 条回复    2019-12-18 19:09:15 +08:00
    gowa
        1
    gowa  
       2019-12-17 21:28:18 +08:00 via Android
    看一下 python 在 c 层面是如何表示浮点数的 不谢
    gowa
        2
    gowa  
       2019-12-17 21:30:11 +08:00 via Android   ❤️ 2
    jinliming2
        3
    jinliming2  
       2019-12-17 22:17:40 +08:00 via iPhone
    double 和 float 没有办法准确表示部分小数的
    yujincheng08
        4
    yujincheng08  
       2019-12-17 22:25:32 +08:00
    浮点数误差
    skies457
        5
    skies457  
       2019-12-17 22:49:03 +08:00
    试试 6e18 + 2000 - 6e18
    Xs0ul
        6
    Xs0ul  
       2019-12-17 22:51:58 +08:00
    这个数是 2^-24, 是 half 能表示的最小正数
    xjx0524
        7
    xjx0524  
    OP
       2019-12-18 11:02:53 +08:00
    @Xs0ul 请问下 half 指的是什么呢? float16 吗?
    xjx0524
        8
    xjx0524  
    OP
       2019-12-18 11:18:20 +08:00
    @gowa
    @jinliming2
    @yujincheng08
    @skies457
    看了一下 754 浮点数标准,再请问下
    1、python 下为什么对一个浮点数 getsizeof 是 24 呢
    2、怎么在 python 里方便的看一个浮点数的二进制表示
    3、还是没有想明白,sigmoid 函数怎么溢出出来负数了
    aloxaf
        9
    aloxaf  
       2019-12-18 19:09:15 +08:00   ❤️ 1
    浮点数在计算机中的表示是不精确的, 很容易被坑到
    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 就行了...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5988 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:24 · PVG 11:24 · LAX 19:24 · JFK 22:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.