1069|16

20

帖子

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会这样,其他数据不会,也不知道是什么问题!!!

 

 

最新回复

这是CPU处理浮点的时候就这样吧,除非采用整数表示  详情 回复 发表于 2023-11-24 00:00
点赞 关注
 
 

回复
举报

20

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

各位大佬可以试试!

 
 
 

回复

4771

帖子

12

TA的资源

版主

板凳
 

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

3.00000001的异曲同工之妙

点评

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

回复

1025

帖子

0

TA的资源

纯净的硅(高级)

4
 

赞同楼上!

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

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

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

点评

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

回复

409

帖子

7

TA的资源

纯净的硅(初级)

5
 

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

 
 
 

回复

6773

帖子

2

TA的资源

版主

6
 

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

 
 
 

回复

351

帖子

3

TA的资源

纯净的硅(初级)

7
 

这个与屏幕没关系,与编绎器环境有关,平时我们说到小数数字时一般都是讲四舍五入,但是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看齐,奇进偶不进”,才导致了你上面的最后一位小数不同的问题。

 
 
 

回复

2939

帖子

0

TA的资源

五彩晶圆(中级)

8
 

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

点评

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

回复

20

帖子

0

TA的资源

一粒金砂(中级)

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

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

 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

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

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

 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

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

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

 
 
 

回复

4771

帖子

12

TA的资源

版主

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

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

点评

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

回复

20

帖子

0

TA的资源

一粒金砂(中级)

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

只有这0.96 0.97两个数字不行

点评

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

回复

1万

帖子

25

TA的资源

版主

14
 

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

 

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

 
 
 

回复

4771

帖子

12

TA的资源

版主

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

只有这0.96 0.97两个数字不行

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

回复

7452

帖子

2

TA的资源

五彩晶圆(高级)

16
 

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

个人签名

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

 
 
 

回复

1463

帖子

0

TA的资源

五彩晶圆(初级)

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

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
【EEWORLD模块整理】+tlc2543(A/D)

今年我用的模块资料 已经证实好用

FPGA DCM时钟管理单元的理解

看Xilinx的Datasheet会注意到Xilinx的FPGA没有PLL,其实DCM就是时间管理单元。 --------------------------------------------- ...

电烙铁的使用小技巧

本人原创——乃自己当时查阅的资料和自己的一点点经验而写成,如有错误请多指教! 首先要说明的是,使用电烙 ...

ubuntu下修改内核发生“ncurses libraries“错误(解决方法)

BSEC@bsec-server:~/kernel/Kernel$ make menuconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/basic/docproc HOSTCC script ...

在屏幕上显示大写字母DMH的VGA控制器

本帖最后由 PuesueDream 于 2015-7-22 17:18 编辑 基于ise14.7平台,用Nexys3开发板弄了一个显示程序。程序包含六部分 首 ...

msp430f149波特率设置

本帖最后由 灞波儿奔 于 2020-1-10 23:14 编辑 TI MSP430系列单片机,usart模块的波特率值设定是通过以下三个寄存器决定的 ...

为什么给一个变量赋值0时,直接写=0,而给它赋值0xffffffff时要写成=0xffffffffu

为什么给一个变量赋值0时,直接写*ram=0即可,而给它赋值0xffffffff时要写成*ram=0xffffffffu, 以下是具体的代码 /****** ...

报名提醒:最后几小时,100套价值390元平头哥RISC-V生态开发板免费送~

最后几小时啦,想要的网友速速来~100套价值390元平头哥RISC-V生态开发板——RVB2601来袭,现在提交创意,即有机会免费 ...

在现代计算机上运行虚拟Mac Quadra 900

682909 macintosh.js 是一个模拟 1991 年 Macintosh Quadra 900 和摩托罗拉 CPU 的虚拟机,它完全用 JavaScript 编写(因此请 ...

反激电源辅助供电绕组串联电阻

看到很多反激电源辅助绕组串联电阻的,如下图电阻Rvcc,想问一下这个电阻的作用是什么?

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表