为什么sprintf_s在不同版本的Visual Studio中给出不同的结果?
Why is the sprintf_s giving different result in different versions of Visual Studio?
sprintf_s(buf, "%.*f", 14, 0.182696884245135);
in VS2008 = 0.18269688424514
in VS2015 = 0.18269688424513
sprintf_s的行为改变了吗?我怎样才能恢复以前的行为?
我们为Universal CRT和Visual c++ 2015重写了浮点解析器和格式化器,以提高正确性。参见Visual c++文档中Visual c++ 2015的重大变化;有一节题为"浮点格式和解析"。
Visual c++ 2015的结果是正确舍入的结果。输入字符串0.182696884245135
被转换为以下双精度值,这是最接近的可表示值:
0.18269688424513'49994693288181224488653242588043212890625
请注意第14位小数点后的勾号。第15位是4
,因此当用14位小数格式化数字时,该数字将被"向下舍入"(或截断),而不是向上。
Visual c++ 2008的结果不正确。我不知道是否在解析或格式化过程中引入了错误。没有办法得到旧的,不正确的行为与通用CRT和Visual c++ 2015。
Vs2008使用80位浮点量,并且在转换为双精度数时将此更精确的值四舍五入。
Vs2015不这样做,只是截断文字。
我相信你可以通过改变编译器设置来切换这两种方案。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- valgrind-hellgrind与泄漏检查的结果不同
- 在 C++ 中使用带有正则表达式的 G++ 和 Visual Studio 14 2015 编译器时会产生不同的结果
- acos(double) 在 x64 和 x32 Visual Studio 上给出不同的结果
- 在这种情况下,GCC 和 clang 是否显示与 Visual Studio 相同的结果,关于语言链接?
- CodeBlocks和Visual Studio 2019中的不同结果
- A ^= B ^= A ^= B;C# Visual Studio 中的意外结果
- Visual Studio 2015 EXP结果有所不同
- C++正则表达式Visual Studio Community 2015给出<regex>意想不到的结果
- 错误 PRJ0002:错误结果 -1073741515 从"C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.
- 在visual studio和eclipse中打印wchar_t会得到不同的结果
- Visual Studio可变宏展开会产生意想不到的结果
- 在Visual Studio中模拟一个简单的内存泄漏,结果有点混乱
- 相同的代码在Visual Studio 2010和Code Blocks 10.05中给出不同的结果
- 为什么sprintf_s在不同版本的Visual Studio中给出不同的结果?
- Visual Studio 2010 O2优化给出错误结果
- 按照visual studio中的定义获取命令结果
- visual studio 2010-C++模板:使用MInGW获取错误的结果(输出)
- sin(<减零>) 不会在 Visual Studio 2013 64 位上返回预期的结果