C中float类型与0比较用e-7的原因

本文深入探讨了float单精度在内存中的存储方式及为何在与0比较时需要使用1e-7作为阈值,解释了这一数值选择背后的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近看到一道面试题,要求写出 bool, int , float, 指针变量 与 0 的判断相等的表示形式。
这里float类型给出的参考答案是:

if (fabs(data) <= 1e-7)

那么问题来了,为什么用 1e-7呢?

通过查阅资料,我们发现,float单精度,在内存中应该是 1 个符号位, 8个指数位 和 23个有效数据位。而 2^23 ~ 10^ 7, 由此得到 1e-7.

参考资料:
1.c中float和double数据与0比较时,为什么一定要用1e-7的格式

2.float类型和0比较大小

### 如何在RT-Thread系统中正确使用`float`类型 在RT-Thread系统中,当涉及到`float`类型的定义和使用时,需要注意一些特定的编译选项以及环境配置。以下是详细的说明: #### 编译器支持浮点数运算 RT-Thread通常运行于嵌入式环境中,在这种环境下,默认情况下可能不会启用对浮点数的支持。如果项目启用了`newlib-nano`库来减少内存占用,则需要额外配置以支持浮点数操作[^2]。 为了使程序能够正常使用`printf`或`scanf`处理浮点数数据,需确保以下设置已开启: - **Use float with nano printf** - **Use float with nano scanf** 这些选项允许标准输入输出函数识别并正确解析浮点数值。 #### 定义初始化`float`变量 在C语言中,可以像其他平台一样直接声明和初始化`float`类型的数据。例如: ```c #include <stdio.h> int main(void) { float value = 3.14f; printf("The value is %f\n", value); return 0; } ``` 注意这里的格式化字符串 `%f` 是用来表示浮点数的占位符。同时建议显式地给常量加上 `f` 后缀 (如 `3.14f`) 来表明其为单精度浮点数而非双精度 (`double`),这样能更好地适配某些资源受限的目标硬件。 #### 配置CPU指令集扩展 部分微控制器提供了专门用于加速数学计算(包括但不限于浮点运算)的硬件单元——FPU(Floating Point Unit),比如基于ARM Cortex-M系列处理器的产品。要充分利用这一特性,应该调整工具链的相关参数。例如,在MDK(Keil uVision)里可以通过如下路径指定目标架构包含完整的单精度浮点能力: ``` Settings -> Target Options -> Manage... C/C++ Code Compatibility -> --cpu=Cortex-M4.fp.sp ``` 此命令告诉编译器生成适合具有SP(single precision)-only FPU特性的CM4核心的应用代码[^5]。 #### 测试示例 下面给出一段简单的测试代码片段展示如何在RT-Thread应用层面上运用`float`类型完成基本算术逻辑。 ```c #include <rtthread.h> #include <stdio.h> static void test_float_task_entry(void* parameter){ float a=1.23,b=-7.89,c,d,e; c=a+b; d=a*b; e=(a>b)?a:b; rt_kprintf("\nIn Task:\na=%g b=%g\nc(a+b)=%g d(a*b)=%g e(max)=%g\n", a,b,c,d,e); } int finit_test_float(){ struct rt_thread t; static char task_stack[512]; /* Initialize the thread */ rt_thread_init(&t, "fltst", test_float_task_entry, RT_NULL, &task_stack[0], sizeof(task_stack), 20, // Priority level 20 ); // Time slice ticks /* Start it as detached mode */ rt_thread_detach(&t); return 0; } MSH_CMD_EXPORT(finit_test_float,test_float); ``` 以上脚本创建了一个新线程执行有关两个实数加减乘除比较的操作,并打印结果至串口终端。记得按照前述指导修改工程属性后再尝试编译下载验证效果哦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值