pet是什么检查| 胸部中间痛什么原因引起的| 别扭是什么意思| 司空见惯是什么意思| 儿童感冒吃什么药| 牙齿上有黄斑是什么原因| 什么蛋不能吃脑筋急转弯| 熊猫长什么样| 肛瘘是什么原因引起的| 650是什么意思| 连坐是什么意思| 五月底是什么星座| 什么是社会考生| clarks是什么牌子| 家里进鸟了是什么预兆| 男生学什么技术吃香| 区块链技术是什么| 吴亦凡演过什么电影| 孕早期不能吃什么食物| 肝气虚吃什么中成药| 白癜风不能吃什么| 指甲凹陷是什么原因| 贤上腺瘤是什么意思| 九月三号是什么星座| 什么时候闰十二月| 36计第一计是什么| 一个m是什么品牌| 男生什么情况想种草莓| 脾气暴躁易怒是什么病| 做梦梦见兔子是什么意思| 智齿是什么意思| 胃食管反流挂什么科| 为什么晚上不能吃姜| 脱敏处理是什么意思| 做梦梦见僵尸是什么预兆| 精湛是什么意思| 什么是资本运作| 芝士是什么做的| 斑秃用什么药| 什么是玉石| 藕断丝连是什么意思| 说什么情深似海我却不敢当| 农历5月是什么星座| 什么是爱情| 脚酸臭是什么原因| 什么水果含叶酸最多| 7.14什么情人节| 家里适合养什么鱼| May什么意思| 子宫外怀孕有什么症状| 弓形虫抗体阳性是什么意思| 这是什么植物| 血液由什么组成| 血脂四项包括什么| 嘴巴下面长痘痘是什么原因引起的| 1952年属什么生肖| 夹不住尿是什么原因| 美女是指什么生肖| 扁桃体发炎吃什么消炎药| 整天想睡觉是什么原因| 送女朋友什么礼物| 尿酸高什么原因| 什么水果对肝有好处| 酱酱酿酿是什么意思| 补钙有什么好处| 什么是有机奶粉| 后宫是什么意思| 什么是买手店| 心眼是什么意思| 梦见到处都是蛇预示着什么| 脚底疼痛是什么原因| 嗜是什么意思| 身在其位必谋其职是什么意思| 霜花店讲了什么故事| max是什么品牌| 穿刺是什么意思| 虎斑猫是什么品种| 眼睛看什么科| 甲状腺吃什么药| 孕妇梦见很多蛇是什么意思| 风起云涌是什么生肖| 粉蒸肉用什么肉好吃| 蜻蜓吃什么| 遗精频繁是什么原因| 什么最解酒最快| 幽门螺杆菌挂什么科| 在什么情况下最容易怀孕| 拔苗助长告诉我们什么道理| 阑尾炎属于什么科室| 樱桃泡酒有什么功效| 可否是什么意思| 蕃秀什么意思| 7个月的宝宝吃什么辅食| 仔字五行属什么| 兔子是什么意思| 为什么总是长口腔溃疡| 4月4号是什么星座| 月经期间适合吃什么食物| 尿红细胞高是什么原因| 什么东西一吃就死| 前凸后翘什么意思| 不遗余力的遗是什么意思| 流云是什么意思| 阳历7月15日是什么星座| 有利有弊是什么意思| 月经很少什么原因| fml什么意思| 喝可乐有什么好处| qid医学上是什么意思| 6月28是什么星座| 与狼共舞男装什么档次| 咳嗽吃什么好| 荨麻疹可以吃什么水果| 栗子不能和什么一起吃| 羊水少了对宝宝有什么影响| 肚子疼呕吐是什么原因引起的| 内分泌失调有什么症状| 月经期间喝酒会有什么影响| 电解液是什么| aj和nike什么关系| 放疗后吃什么恢复的快| 泄是什么意思| 阳历2月份是什么星座| 吃什么食物可以降低胆固醇| 天青色等烟雨是什么意思| 什么什么似火| 断章取义是什么生肖| 孔雀鱼吃什么| 右耳痒是什么预兆| dha什么时候吃| 身体内热是什么原因| 吃什么降血压的食物| 户籍所在地是指什么| 什么样的血管瘤不用治| 心理咨询挂什么科| 什么是性格| 南字五行属什么| 肝内多发低密度影是什么意思| egg是什么意思| 照影是什么意思| 佛手柑是什么| aca是什么意思| 脚拇指外翻是什么原因造成的| energy是什么牌子| 胆红素高吃什么食物能降得快| 恃势之刑是什么意思| 自豪的什么| 双肾盂分离是什么意思| olp是什么意思| 熬夜眼睛红血丝用什么眼药水| 鼻子里面痒是什么原因| 心代表什么数字| 猪肉炒什么菜好吃| 什么叫打气 是吸毒吗| 农历7月25日是什么星座| 七月一号什么星座| lsa是什么胎位| 头疼 吃什么药| 手起皮是什么原因| 睡觉时胳膊和手发麻是什么原因| 什么是月子病| 包拯属什么生肖| 肠漏是什么| dha什么时候吃| 射代表什么生肖| 什么学海无涯苦作舟| 晁盖的绰号是什么| 眉宇是什么意思| 三月29号是什么星座| 有什么有什么| 消化不良大便什么颜色| 猪红是什么| 宫颈息肉吃什么药能消| 朋友开业送什么礼物好| 什么是生辰八字| 国家栋梁指的是什么官| 狗狗咳嗽吃什么药| 高风亮节是什么意思| 新股配号数量是什么意思| 什么叫正盐| 肠癌是什么原因造成的| 身份证是什么字体| 11月27是什么星座| 舌头有齿痕吃什么药| 金渐层是什么品种| 小孩疳积有什么症状| 韩墨池是什么电视剧| 增加胃动力最好的药是什么药| 甲硝唑吃多了有什么危害| 一直打哈欠是什么原因| 耳朵痛用什么药| 甲状腺斑块是什么意思| 阴道炎挂什么科| 乳头是什么| 肺气阴两虚吃什么中成药| 蒲公英泡水喝有什么好处| 拜阿司匹林和阿司匹林有什么区别| 仓鼠是什么动物| 抑菌液有什么作用| 梦见去看病是什么意思| 什么地回答| 唇炎属于什么科| 什么桥下没有水脑筋急转弯| 约炮什么意思| 水蛭是什么动物| 晴水翡翠属于什么档次| con是什么意思| 榅桲是什么水果| 大忌什么意思| 喜鹊吃什么| 什么牌子的蜂胶最好| 身家是什么意思| 宵夜吃什么| 什么蔬菜含维生素c最多| 什么样的黄河| 六月二十日是什么日子| 哮喘吃什么药好| 维生素d和维生素ad有什么区别| 1月21日什么星座| 黑色皮肤适合什么颜色的衣服| 干燥综合征挂什么科| 漫反射是什么意思| 狗为什么会吐| 小孩脚后跟疼是什么原因| 68岁属什么| 苏打水是什么| 睡午觉有什么好处| 手腕三条纹代表什么| 国士无双什么意思| 顽固不化是什么意思| 邮政什么时候上班| 女人味是什么| 男性硬下疳是什么样子| 怀孕之后身体有什么变化| 养殖什么最赚钱| 切口憩室是什么意思| 胚胎停育有什么症状| 胃痉挛吃什么药| 告示是什么意思| 乳腺囊性增生是什么意思| 什么叫便溏| 两败俱伤是什么意思| 右边小腹疼是什么原因女性| 李白为什么叫青莲居士| 乳腺增生是什么原因引起的| 口角炎用什么药膏| 倦怠期是什么意思| 女人吃山竹有什么好处| 激素是什么意思| 青年节是什么生肖| 孕妇用什么驱蚊最安全| 大便感觉拉不干净什么原因| 奶篓子是什么意思| 安全期是指什么时间| 额头长痘是因为什么| 脐炎用什么药| 瑞字属于五行属什么| 五味杂粮什么意思| 打喷嚏流清鼻涕属于什么感冒| 女生小便带血是什么原因| 牙齿像锯齿是什么原因| 主导是什么意思| 囊肿是什么东西| 梦到被猪咬是什么意思| 百度
打印
[学习资料]

“钻戒”酵母酶有助癌症治疗

[复制链接]
681|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaoyang9992006|  楼主 | 2025-7-22 17:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有网友发帖声称最近在用 Keil C51(STC12F2K60S2) 做项目时,发现一个奇怪的现象:
调用 pow(2.0f, 26.0f) 计算 2 的 26 次方,结果竟然是 67108952,而正确值应该是 67,108,864。更奇怪的是,pow(2.0f, 28.0f) 却能算出正确值 268,435,456。
测试代码:
#include <math.h>
#include <stdio.h>

void main() {
    float a = pow(2.0f, 26.0f);  // 输出 67108952(错误)
    float b = pow(2.0f, 28.0f);  // 输出 268435456(正确)
    printf("2^26 = %.0f\n", a);
    printf("2^28 = %.0f\n", b);
}
原因分析:浮点数的存储方式
计算机中的浮点数(float)遵循 IEEE 754 标准,采用 科学计数法 存储,但精度有限:

单精度 float(32位):

1位符号位

8位指数位

23位尾数位(有效数字)

实际精度仅约 6~7 位十进制数


关键问题:

当数值超过 2^23(即 8,388,608)时,float 的尾数位数不足以精确表示所有整数,导致 舍入误差。

pow(2.0f, 26.0f) 的数学值是 67,108,864(0x4000000),但由于 float 存储时只能近似表示,实际计算值可能是 67,108,952(误差 +88)。

而 pow(2.0f, 28.0f) 刚好能被 float 精确存储,因此结果正确。

验证方法:查看浮点数的二进制存储
我们可以打印 pow(2.0f, 26.0f) 的二进制表示,观察其存储方式:
#include <stdint.h>

void print_float_bits(float f) {
    uint32_t bits = *(uint32_t*)&f;
    printf("Hex: 0x%08X\n", bits);
}

int main() {
    float f26 = pow(2.0f, 26.0f);
    print_float_bits(f26);  // 输出可能是 0x4C800000 或近似值
    return 0;
}
如果存储值不是 0x4C800000(理论值),就说明发生了 舍入误差。

解决方案
改用 double(双精度浮点)
double 有 52位尾数,精度更高,但 8位单片机(如STC12)可能不支持硬件浮点,运算极慢。

double result = pow(2.0, 26.0);  // 更精确,但效率低
使用整数运算(推荐)
对于 2^n,直接用 位运算:
uint32_t result = 1UL << 26;  // 精确计算 2^26 = 67,108,864

查表法(适用于固定范围)
const uint32_t pow2_table[] = {1, 2, 4, 8, ..., 268435456};
uint32_t result = pow2_table[26];  // 直接查表
总结
float 精度有限,大整数计算可能出错。

8位单片机尽量用整数运算或查表法,避免浮点误差。

理解 IEEE 754 存储方式,才能避免类似问题!


沙发
gaoyang9992006|  楼主 | 2025-7-22 17:01 | 只看该作者
你的项目里遇到过浮点误差吗?欢迎讨论!

板凳
梦境摆渡人| | 2025-7-24 19:36 | 只看该作者
这个帖子解释得很清楚,浮点数的精度问题确实会导致计算误差,特别是在处理大数值时。
地板
wanduzi| | 2025-7-26 14:59 | 只看该作者
原来是十进制转换成二进制时候导致的问题啊。666
5
mintspring| | 2025-7-28 09:25 | 只看该作者
这个确实值得考虑。进制的转换会导致误差。
6
玛尼玛尼哄| | 2025-7-28 17:43 | 只看该作者
精度是个问题,为何不出一份类似人类计算方法的库。这样可以匹配各种长度的计算了。
7
玛尼玛尼哄| | 2025-7-28 17:43 | 只看该作者
将数字转换为字符存储,理由人类计算数学加减乘除的方法。
8
破晓战神| | 2025-7-28 20:37 | 只看该作者
确实,浮点数的精度问题在嵌入式开发中很常见。使用整数运算或查表法可以避免这类问题。
9
yiyigirl2014| | 2025-7-29 19:34 | 只看该作者
这种误差还从没考虑过。
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2042

主题

16336

帖子

221

粉丝
百度