C语言赋值浮点数时候立即数后面加上f的意义和注意事项

在C语言中常见定义浮点数时会在立即数的后面加上f表明它是一个浮点数:

cpp 复制代码
float a = 3.14159265f;

或者

cpp 复制代码
#define t 3.14159265f;

但是在使用它时应注意一个事情,当你在立即数后面加上f时,编译器会认为它是一个float,当你在用它定义double或赋值时会以float的精度赋值,这会产生一个精度损失的问题,下面是一个示例:

cpp 复制代码
#include <stdio.h>

int main() {
  double ft = 0.1234567890123456f;
  printf("%.16f\n", ft);
}

打印结果:

0.1234567910432816

很明显结果是错误的,可以看到精度从第8位开始就错了,这是因为float的精度根据IEEE 754的标准,它只占7位有效位,为什么只占7位这里给大家补充一下这个知识,在IEE 754的标准里float占4字节,其中23位表示小数点,而23bit位(23^2)最大能表示的数为7位,所以它小数点后最大能表示7位。

当我们把后面的f去掉后在打印一下结果就正确了:

0.1234567890123456

f在c语言里是为了区分单精度和双精度的浮点数数据,这一点大家在开发时应注意,不要因为书写习惯在一些双精度的浮点数里加上了f导致精度丢失了。

相关推荐
福兮说7 小时前
URL 编码的七个坑:c++ 传到后端变空格、%25 套娃、截断 emoji 直接报错
开发语言·前端·javascript·node.js·url
小的时候可菜了8 小时前
JS 异步的本质:从单线程到 thenable(一条进化链)
开发语言·前端·javascript
可乐鸡翅yeah_8 小时前
hls.js 配置 loadStartPosition,点播起始播放位置踩坑
开发语言·javascript·网络协议·ecmascript·m3u8在线
en.en..8 小时前
Linux 进程退出exit(函数)
java·开发语言·算法
Cx330❀8 小时前
【Qt 进阶指南】详解 Qt 常用标准对话框与主窗口组件架构
开发语言·qt·ui·性能优化·架构·图形渲染
Light Gao8 小时前
Encoder 与 Decoder 详解:从 Embedding 到 Seq2Seq 的完整数据流
java·开发语言·embedding
HZZD_HZZD8 小时前
弱网下CoAP还省吗?合众致达Cat.1电表90天实测:MQTT重连流量占52%、续航差距从38%拉大到73%
开发语言·物联网·php·腾讯云
web打印社区8 小时前
Windows 网页静默打印设置步骤:客户端、防火墙与联调清单
开发语言·前端·javascript·chrome·pdf·ecmascript
小师兄吃牛肉8 小时前
什么是R语言?如何快速学习R语言
开发语言·学习·r语言
phltxy9 小时前
C 语言文件操作:让数据从内存走向持久化
c语言·网络·数据库