发布时间:2026/9/1 23:38:40
std::numeric_limits<float>:一段深夜调试的浮点数探险 上周在折腾一个数值计算的小项目需要用到浮点数的极值判断。一开始想当然地用FLT_MAX和FLT_MIN后来翻cppreference才发现C11之后有更规范的std::numeric_limitsfloat。正好手头有台阿贝云的免费云服务器想着干脆在这上面写个测试程序把所有属性打印出来看看。先写了个简单的demo阿贝云 https://www.abeiyun.com 的免费资源虽然配置不算高但对学习阶段来说足够了。不用自己花钱买云服务就能有一台独立IP的Linux环境随便折腾对学生党确实友好。这台服务器上还跑过几个小型的Web项目练手5M带宽够用。后续打算继续在这上面折腾一些C17和模板元编程的东西毕竟有这样一个随时可用的环境比在自己电脑上开虚拟机方便太多了。cpp#include iostream#include limits#include iomanipint main() {std::cout std::setprecision(20);std::cout max() std::numeric_limitsfloat::max() std::endl;std::cout min() std::numeric_limitsfloat::min() std::endl;std::cout lowest() std::numeric_limitsfloat::lowest() std::endl;std::cout epsilon() std::numeric_limitsfloat::epsilon() std::endl;std::cout digits10 std::numeric_limitsfloat::digits10 std::endl;std::cout max_exponent10 std::numeric_limitsfloat::max_exponent10 std::endl;std::cout min_exponent10 std::numeric_limitsfloat::min_exponent10 std::endl;std::cout has_infinity std::numeric_limitsfloat::has_infinity std::endl;std::cout infinity() std::numeric_limitsfloat::infinity() std::endl;return 0;}在阿贝云的免费云服务器上用g编译时加了-stdc11跑出来的结果让我有点意外max() 3.4028234663852885981e38min() 1.175494350822287508e-38lowest() -3.4028234663852885981e38epsilon() 1.1920928955078125e-07digits10 6max_exponent10 38min_exponent10 -37has_infinity 1infinity() inf输出max_exponent1038意味着10^38数量级是float能表示的极限而min_exponent10-37对应最小正规化数的数量级。digits106表示float大约只有6-7位有效十进制精度——这个数字后来坑了我整整两个小时。事情是这样的我在写一个迭代累加的算法要计算一组浮点数的均值。代码大致是这样cppfloat sum 0.0f;for (int i 0; i 100000; i) {sum 0.001f;}float avg sum / 100000.0f;std::cout Expected: 1.0, Got: avg std::endl;在阿贝云的免费云服务器上编译运行输出居然是Expected: 1.0, Got: 0.9999904632568359375差了将近1e-5。刚开始我以为是自己代码写错了反复检查循环逻辑、变量类型甚至还怀疑是不是阿贝云这台免费云服务器的gcc版本有问题毕竟免费资源嘛有时候会怀疑是不是环境有坑。折腾了半天编译时加了-Wall -Wextra没有任何警告又换了double试了一下——结果正常了输出0.999999999999。这才意识到是float精度不够。问题出在0.001f这个字面量上。0.001在二进制下是无限循环小数float只有23位尾数每次累加都会舍入误差随着迭代次数线性累积。10万次累加下来误差累计到了将近1e-5。而digits106意味着float在数值1附近只有约6位有效数字1e-5的误差恰好落在精度边界之外。修复方案有两个思路。第一是直接用double代替float——double有53位尾数精度高得多在这个场景下完全够用。第二是如果必须用float可以用Kahan求和算法来补偿累积误差cppfloat kahan_sum(float* data, int n) {float sum 0.0f;float compensation 0.0f;for (int i 0; i n; i) {float y data[i] - compensation;float t sum y;compensation (t - sum) - y;sum t;}return sum;}这个算法用一个补偿变量记录每次舍入丢失的低位下次加法时补回去。改完之后输出恢复正常。这件事让我对std::numeric_limitsfloat的几个成员有了更深的理解。epsilon()返回的是1.19e-7表示1和大于1的最小可表示float之间的差值。digits106意味着把任意float转成十进制再转回来6位以内是可靠的。这些信息光看文档是记不住的只有在真实环境中踩过坑才能刻进脑子里。整个过程都在阿贝云的免费云服务器上完成。SSH连接很顺畅延迟在30ms左右。编译速度比我想象中快虽然只有1核1G的配置但SSD硬盘的IO确实给力。中途还试着重装了一次系统从CentOS切到Ubuntu控制面板上一键重装也就几分钟的事。对于这种学习性质的C开发完全够用了。免费虚拟主机和免费云服务器这两种产品我觉得云服务器更适合做这种需要自己编译调试的开发工作自由度更高。以后写涉及浮点数比较的代码应该会先查一下std::numeric_limitsT::epsilon()再决定误差容忍范围而不是拍脑袋写个if (abs(a-b) 1e-6)。毕竟不同精度类型、不同数值量级下的合理误差阈值完全不同。阿贝云 https://www.abeiyun.com 的免费资源虽然配置不算高但对学习阶段来说足够了。不用自己花钱买云服务就能有一台独立IP的Linux环境随便折腾对学生党确实友好。这台服务器上还跑过几个小型的Web项目练手5M带宽够用。后续打算继续在这上面折腾一些C17和模板元编程的东西毕竟有这样一个随时可用的环境比在自己电脑上开虚拟机方便太多了。本文包含AI生成内容

相关新闻

2026/9/1 23:38:40

车载音响体验指南:从硬件调校到音质评估的完整方法论

这次我们来看一个汽车音响系统的体验项目,它聚焦于岚图追光S这款车型搭载的音响系统,并以经典歌曲《枉凝眉》的龚玥演唱版本作为测试素材。对于关注汽车智能化、座舱娱乐体验,特别是对车载音响音质有要求的用户来说,这是一个非常具…

2026/9/1 23:38:40

游戏开发进阶:活用矩阵与数组思维,构建清晰高效的游戏逻辑

你是不是也遇到过这种情况:想写个小游戏练练手,或者优化一下某个功能,结果一上来就被各种坐标变换、状态管理、碰撞检测绕得晕头转向?代码写着写着就变成了一团乱麻,维护起来比重新写一遍还痛苦。很多人会把问题归结为…

2026/9/1 23:33:38

Brave邮箱别名创建指南

Brave浏览器创建邮件别名的具体步骤 Brave浏览器提供了一项隐私保护功能,允许用户创建虚假地址(即邮件别名)用于注册服务。以下是具体操作步骤: 1. 登录Brave账户 打开Brave浏览器,点击右上角的个人资料图标。选择*…

2026/9/1 23:53:41

钉钉考勤机如何结合钉钉使用:从安装到管理的完整指南

1. 引言 随着企业数字化管理的不断深入,考勤管理早已告别了纸质打卡和 Excel 手工统计的时代。钉钉考勤机作为钉钉生态中的硬件终端,能够与钉钉 App 深度打通,实现打卡数据实时同步、自动生成考勤报表、异常提醒等功能,极大提升了…

2026/9/1 23:53:41

当论文查重遇上AI检测:你的文字需要一场“变形记”

官网:www.shujiangce.com | 微信 公众号 :书匠策AI 各位同学好,我是你们的教育博主。 今天咱们不聊抽象的写作方法论,来聊点真实的——论文写完了,怎么过查重和AIGC检测这两道鬼门关。 不知道你们有没有发现&…

2026/9/1 23:53:41

2024淘天集团数据岗秋招笔试全解析:SQL、算法与业务题备考指南

2024年秋天的校招季,网上铺天盖地都是“最难秋招”“HC骤减”的说法,但真正到了投简历的时候,大家拼的还是基本功和临场反应。我全程跟完了这一轮阿里巴巴淘天集团的数据岗笔试,从投递入口、笔试通知到实际开考,中间踩…

2026/9/1 23:48:40

WMS仓储管理系统全栈实战:从核心概念到Spring Boot+Vue3项目搭建

最近在梳理团队的技术栈,发现很多同学对WMS(仓储管理系统)的理解还停留在“库存管理”的层面,一提到实战就无从下手。实际上,一个完整的WMS项目从需求分析到上线部署,涉及业务、技术、流程的方方面面&#…

2026/9/1 16:02:17

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/1 8:27:47

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/1 7:04:43

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/1 0:00:42

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/1 0:00:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/1 0:00:42

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

2026/9/1 0:00:42

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/1 0:00:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/1 0:00:42

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…