Iva*_*lev 8 c printf windows-10
#include <stdio.h>
int main()
{
float f = 1717.7890625;
printf( "%.6f", f );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用 Visual Studio 19 (16.9.2) 为 x64 arch 编译了这段代码,并在我的两台 Windows 10 PC 上运行了结果:
1717.7890631717.789063发布:1717.789062新版本Debug和Release结果不一样的原因是什么?如何修复它以使两个版本的结果相同?
补充: 代码:
#include <stdio.h>
int main()
{
double f = 0.25;
printf( "%.1f", f );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在新的和旧的 Win10 版本上有相同的行为。我建议,这是较新的 ucrtbase.dll 版本中的错误
Iva*_*lev 10
我发现了 Windows 版本和调试/发布模式之间程序行为如此不同的原因。
新的 Windows 更新(19041.* 如果我理解正确的话)改变了浮点类型小数部分的舍入规则:以前它在以 5: 结尾的情况下舍入到更大1.25 -> 1.3,但现在它舍入到最接近的偶数: 1.25 -> 1.2, 1.35 -> 1.4。
要了解新 Win 10 版本上调试和发布之间的区别,需要注意ucrtbase.dll 的使用和更新规则。
因此,解决方案是在新的 Windows 10 版本上安装新的 Windows 10 SDK 以实现相同的行为或将 printf() 函数从https://github.com/fmtlib/fmt切换为 fmt::printf() 函数,例如, 使结果在所有 Windows 版本上都相同。
| 归档时间: |
|
| 查看次数: |
1119 次 |
| 最近记录: |