C++浮点数format时的舍入问题

embedded/2024/9/23 10:50:54/

C++浮点数format时的舍入问题

首先有这样一段代码:

#include <iostream>
#include <stdio.h>
using namespace std;int main() 
{cout << " main begin : " << endl;printf("%.0f \r\n", 1.5);printf("%.0f \r\n", 1.51);printf("%.0f \r\n", 2.5);printf("%.0f \r\n", 2.51);return 1;
}

预期输出是什么?
我以为按照四舍五入会输出 2 2 3 3
但是实际结果:
在这里插入图片描述

其他的都没问题,只有 2.5 保留一位小数时是2不是3有点奇怪,然后查了文档,最后找到这样一段:

从 Windows 10 版本 2004(内部版本 19041)开始,printf 系列函数根据 IEEE 754 的舍入规则输出可精确表示的浮点数。 在早期的 Windows 版本中,以“5”结尾并且可精确表示的浮点数总是向上取整。 IEEE 754 规定它们必须舍入到最接近的偶数(也称为“四舍六入五成双”)。 例如,printf(“%1.0f”, 1.5) 和 printf(“%1.0f”, 2.5) 都应舍入为 2。 之前,1.5 舍入为 2,2.5 舍入为 3。

来源:MSDN-learn

也就是IEEE 754的标准规定了“四舍六入五成双”这种取整方式,而像是IEEE 754这类标准我以前从没有仔细了解过,遇到也只是简单扫一眼就过去了,所以才会遇到今天这个问题而不理解;

IEEE 754 是什么:
IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number),一些特殊数值(无穷∞与非数值NaN),以及这些数值的“浮点数运算符”。 常见的四种浮点数值表示方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)。C语言的float通常是指IEEE单精确度,而double是指双精确度。

这个标准我也还在学习了解中,就不介绍了;
回到刚才的format问题,刚才给出原因的MSDN页面上也给出了解决方式,对于MSVC系列编译器可以通过添加 legacy_stdio_float_rounding.obj 来变为正常的四舍五入,试一下:
在这里插入图片描述

之后重新运行会发现format规则已经变为了四舍五入:
在这里插入图片描述

但是这个选项仅仅是针对MSVC系列编译器起效的,G++我没有找到类似的属性,如果有人知道麻烦评论告知一下,感激不尽;
在这里插入图片描述


http://www.ppmy.cn/embedded/34781.html

相关文章

Mysql8本地安装

官网&#xff1a; https://www.mysql.com/ yum安装下载&#xff1a;https://dev.mysql.com/downloads/repo/yum/ 二进制安装下载&#xff1a;https://downloads.mysql.com/archives/community/ 安装包下载 yum安装下载 打开网址&#xff08;https://dev.mysql.com/downloads/r…

【精品毕设推荐】搜索引擎的设计与实现

点击免费下载原文及代码 摘要 我们处在一个大数据的时代&#xff0c;伴随着网络信息资源的庞大&#xff0c;人们越来越多地注重怎样才能快速有效地从海量的网络信息中&#xff0c;检索出自己需要的、潜在的、有价值的信息&#xff0c;从而可以有效地在日常工作和生活中发挥作…

数据结构习题--赎金信

数据结构习题–赎金信 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 方法 分…

无人零售,重塑购物新纪元

在这个快节奏的时代&#xff0c;科技的每一次跃进都在悄无声息地改变着我们的生活方式。而今&#xff0c;无人零售正以雷霆之势&#xff0c;颠覆传统购物模式&#xff0c;为我们带来前所未有的便捷与智能体验。想知道无人零售如何彻底改变我们的购物方式吗&#xff1f;跟随我&a…

git commit 提交报错pre-commit hook failed (add --no-verify to bypass) 解决方法,亲测有效

问题截图 今天在执行 git commit 命令时报错&#xff1a;pre-commit hook failed (add --no-verify to bypass) 解决 参考文章&#xff1a;git commit报错&#xff1a;pre-commit hook failed的解决方法 具体原理什么的就不解释了&#xff0c;可以看看上面的参考文章 解决方…

AI大模型探索之路-训练篇10:大语言模型Transformer库-Tokenizer组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

navicat premium16.3.9重置

软件下载 官网地址&#xff1a;https://navicat.com.cn/products/ # 准备脚本 1、建一个txt 2、复制以下代码 3、修改文件格式为bat 4、运行bat文件 5、重新打开navicat&#xff0c;试用期重置为14 经测试16.2.3以上版本均可用 echo off set dnInfo set dn2ShellFolder set r…

git使用注意事项事项

以下操作均在gitee平台上实现 文章目录 1、本地仓库和远程仓库有冲突2、git提交自动忽略某些文件3、git无法push提交到远程仓库 1、本地仓库和远程仓库有冲突 在web端修改了文件内容或者删除了文件&#xff0c;本地仓库需要重新把远程仓库拉取到本地&#xff0c;或者强制提交到…