我有一个运行在Windows/Linux上的C++程序。在Windows上,程序是用Visual 2012编译的,Linux是用GCC编译的。当使用sprintf将双倍转换为字符串时,Visual使用的舍入方法不同于用于领带的GCC编译器--即以5结尾的小数。
Visual编译器似乎执行从零到半圆,而GCC则执行圆平,也就是银行家的四舍五入。
圆甚至是理想的行为。
是否可以在visual studio / windows中更改sprintf格式字符串的舍入行为?因为我需要使四舍五入在两者之间保持一致。
下面是一个小示例C++程序,它演示了上面描述的行为:
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产出:
发布于 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版本上进行了测试。当然,在这样做的过程中,从零到圆/从零到圆仍然不是一种选择,所以这并不能帮助你使它的输出与其他平台保持一致。
但如前所述,这无助于跨平台的一致性。
https://stackoverflow.com/questions/31142600
复制相似问题