287|16

17

帖子

0

TA的资源

一粒金砂(中级)

 

发现一个0.96寸OLED的bug [复制链接]

 
  本帖最后由 转转丶 于 2023-11-16 22:58 编辑

固件是官网最新的固件

芯片是ESP32-WROOM-32

OLED驱动是官网的SSD1306.py

现象如图所示

0.96会显示成 0.95999999

0.97会显示成 0.97000001

用round(,2)也不行

除非直接text("0.96")可以显示0.96,其他方法好像都不能直接显示0.96

只有0.96和0.97会这样,其他数据不会,也不知道是什么问题!!!

 

1.png
2.jpg

 

最新回复

这是CPU处理浮点的时候就这样吧,除非采用整数表示  详情 回复 发表于 5 天前
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

 

各位大佬可以试试!

 
 
 

回复

3176

帖子

8

TA的资源

版主

 

这个是显示屏没关系啊 就是变量是多少show多少啊,你变量哪里浮点型位数不对。

3.00000001的异曲同工之妙

点评

请再试试其他的,比如循环答应从0.01到0.99  详情 回复 发表于 2023-11-17 13:27
那为什么只有0.96 0.97不行,其他都是正常的  详情 回复 发表于 2023-11-17 09:34
 
 
 

回复

772

帖子

0

TA的资源

纯净的硅(高级)

 

赞同楼上!

这是CPU处理浮点的特点,除非你自己采用定点的整数表示!

其它任何单片机都有这个现象,因为显示是将你的数转换成了字符,

而被转换的是浮点,就会带来SHOW的"误差"

点评

按这个说法 0.96 转成字符显示 永远都不是0.96了...  详情 回复 发表于 2023-11-17 09:35
个人签名چوآن شـين
 
 
 

回复

308

帖子

4

TA的资源

一粒金砂(高级)

 

这是不是浮点数精度显示问题,单精度也好,双精度也好,并不会所有的数值都可以表示,有效位数决定

 
 
 

回复

4580

帖子

0

TA的资源

版主

 

一直以来都会存在这种问题的,不仅是单片机,我记得之前学JAVA的时候也有这个问题。

 
 
 

回复

261

帖子

1

TA的资源

一粒金砂(高级)

 

这个与屏幕没关系,与编绎器环境有关,平时我们说到小数数字时一般都是讲四舍五入,但是C语言里不是,它的规则是“4舍6入5看齐,奇进偶不进”;另外,要看下C里float和double的小数位数的区别。

float的指数位只有8位,而double的指数位有11位,所以:

float占用4个字节,也就是32个比特。

double占用8个字节,也就是64个比特lei。

float和double的范围是由指数的位数来决定的。

范围:

float的指数范围为-127--128,double的范围是-1023-1024。

负指数决定了绝对值最小的非零数,正指数决定了绝对值最大的数。也即决定了范围。

也即float的范围为-2^128-2^128,double的范围是-2^1024-2^1024。

精度:

float和double的精度是由尾数位决定的。浮点数在内存中是按照科学计数法来存储的,其整数部分始终是一个隐藏着的1。由于他是不变的,因此对精度不会造成影响的。

float精度范围是:2^23 = 8388608,一共7位,因此最多能表示7位,但是能保证的是6位。

double的精度范围是2^52 = 4503599627370496,一共16位,同理最多能表示16位,但是能保证的是15位。

结合C小数点保留规则“4舍6入5看齐,奇进偶不进”,才导致了你上面的最后一位小数不同的问题。

 
 
 

回复

1992

帖子

0

TA的资源

五彩晶圆(初级)

 

是你程序的问题。不是BUG。

点评

同样的程序 为什么0.98可以 0.96 0.97不行...  详情 回复 发表于 2023-11-17 09:32
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

 
tagetage 发表于 2023-11-17 09:22 是你程序的问题。不是BUG。

同样的程序 为什么0.98可以 0.96 0.97不行...

 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

 
吾妻思萌 发表于 2023-11-17 08:21 这个是显示屏没关系啊 就是变量是多少show多少啊,你变量哪里浮点型位数不对。 3.00000001的异曲同工之 ...

那为什么只有0.96 0.97不行,其他都是正常的

 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

 
Gen_X 发表于 2023-11-17 08:49 赞同楼上! 这是CPU处理浮点的特点,除非你自己采用定点的整数表示! 其它任何单片机都有这个现象, ...

按这个说法 0.96 转成字符显示 永远都不是0.96了...

 
 
 

回复

3176

帖子

8

TA的资源

版主

 
吾妻思萌 发表于 2023-11-17 08:21 这个是显示屏没关系啊 就是变量是多少show多少啊,你变量哪里浮点型位数不对。 3.00000001的异曲同工之 ...

请再试试其他的,比如循环答应从0.01到0.99

点评

只有这0.96 0.97两个数字不行  详情 回复 发表于 2023-11-17 14:25
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

 
吾妻思萌 发表于 2023-11-17 13:27 请再试试其他的,比如循环答应从0.01到0.99

只有这0.96 0.97两个数字不行

点评

咦~好厉害 还真有点意思 按理说不应该啊,有且只有这两个数,有点超乎我的预计  详情 回复 发表于 2023-11-18 09:27
 
 
 

回复

1万

帖子

24

TA的资源

版主

 

这个问题其实很早就被讨论过,各种语言都有类似问题。

 

https://blog.csdn.net/qq_32727095/article/details/118106061

 
 
 

回复

3176

帖子

8

TA的资源

版主

 
吾妻思萌 发表于 2023-11-17 13:27
请再试试其他的,比如循环答应从0.01到0.99

只有这0.96 0.97两个数字不行

咦~好厉害 还真有点意思 按理说不应该啊,有且只有这两个数,有点超乎我的预计
 
 
 

回复

6577

帖子

18

TA的资源

五彩晶圆(中级)

 

浮点数的问题呀,应该第一本书就会说这个问题。

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

1285

帖子

0

TA的资源

五彩晶圆(初级)

 
这是CPU处理浮点的时候就这样吧,除非采用整数表示
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表