Visual Studio 2010 和 gcc/g++ 4.6.3 之间 iostream 行为的意外差异

Posted

技术标签:

【中文标题】Visual Studio 2010 和 gcc/g++ 4.6.3 之间 iostream 行为的意外差异【英文标题】:Unexpected difference in iostream behavior between visual studio 2010 and gcc/g++ 4.6.3 【发布时间】:2014-10-01 18:11:55 【问题描述】:

考虑以下代码sn-p:

ofstream o("myFile.txt");

o.precision(14);
o.width(20);
o.setf(ios::showpoint);
o.setf(ios::internal);
o.fill(' ');

double zero = 0.0;

o << zero;

结果是:

0.000000000000000 //Visual Studio 2010

0.0000000000000 //g++

这种差异是可以接受的,还是其中一个编译器的错误?

【问题讨论】:

【参考方案1】:

precision 的文档如下(强调我的):

浮点精度决定最大位数 写在插入操作上以表示浮点数 价值观。如何解释这取决于浮动字段是否 格式标志设置为特定符号(固定或科学) 或者未设置(使用默认表示法,不一定 相当于固定的或科学的)。

对于默认语言环境:

使用默认的浮点表示法,精度字段指定要显示的有意义数字的最大数量 总计计算小数点前和小数点后的值 点。请注意,它不是最小值,因此它不是 如果数字可以,用尾随零填充显示的数字 显示的位数少于精度。

在固定计数法和科学计数法中,精度字段精确指定要在小数点后显示多少位,即使这包括尾随的十进制零。数字 小数点前与此精度无关 案例。

听起来编译器使用不同的format flags。

【讨论】:

非零值是一致的,所以我认为这不是问题。

以上是关于Visual Studio 2010 和 gcc/g++ 4.6.3 之间 iostream 行为的意外差异的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010:扩展/差异

Visual Studio 中的 GCC 样式弱链接?

如何使用 gcc 和 Visual Studio 的“静态链接”和“动态链接”构建 C/C++ 程序?

C++ 与 gcc 和 Visual Studio 不同的编译错误,“在此上下文中”

如何在 Visual Studio 中最好地使用 GCC

Visual Studio 2010 支持哪些 C++11 功能?