首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与sprintf联系的C++舍入行为一致性

与sprintf联系的C++舍入行为一致性
EN

Stack Overflow用户
提问于 2015-06-30 15:35:33
回答 1查看 1.4K关注 0票数 8

我有一个运行在Windows/Linux上的C++程序。在Windows上,程序是用Visual 2012编译的,Linux是用GCC编译的。当使用sprintf将双倍转换为字符串时,Visual使用的舍入方法不同于用于领带的GCC编译器--即以5结尾的小数。

Visual编译器似乎执行从零到半圆,而GCC则执行圆平,也就是银行家的四舍五入。

圆甚至是理想的行为。

是否可以在visual studio / windows中更改sprintf格式字符串的舍入行为?因为我需要使四舍五入在两者之间保持一致。

下面是一个小示例C++程序,它演示了上面描述的行为:

代码语言:javascript
复制
int main()
{   
   char buffer[100];

   double x;
   for (x = -0.5; x <= 10.5; x += 1.0)
   {
      sprintf(buffer,"%4g %.0f\n", x, x);

      std::cout << buffer;
   }  

   return 0;
}

窗口输出。数字从零四舍五入:

使用xCode编译的OSX输出。对偶数使用整数四舍五入:

OSX产出:

EN

回答 1

Stack Overflow用户

发布于 2015-06-30 15:55:23

这是C11标准草案7.21.6.1 ( fprintf函数)中定义的行为,它涵盖了对格式说明符的尊重,同时也包含了C++,因为C++标准依赖于stdio函数的C标准,对于f格式说明符是这样说的:

值四舍五入到适当的数字数。

缺陷报告211也讨论了这一点,它添加了以下内容:

浮点操作( +,-,*,/)和函数库函数以及返回浮点结果的准确性都是定义的,浮点内部表示和由libray例程执行的字符串表示之间的转换的准确性也是定义的。实现可能会说,准确性是未知的。

印刷浮点数的不一致四舍五入在文章中详细介绍了这种不一致之处,并提到:

glibc ()已经更新,以考虑到当前的IEEE舍入模式。这是在2.17版本中完成的;我只是在2.18版本上进行了测试。当然,在这样做的过程中,从零到圆/从零到圆仍然不是一种选择,所以这并不能帮助你使它的输出与其他平台保持一致。

但如前所述,这无助于跨平台的一致性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31142600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档