Win10破坏了printf功能
Win10 broke printf function
#include <stdio.h>
int main()
{
float f = 1717.7890625;
printf( "%.6f", f );
return 0;
}
我用 Visual Studio 19 (16.9.2) 为 x64 arch 编译了这段代码,运行 在我的两台 Windows 10 台电脑上得到了结果:
- 版本 1909(OS 内部版本 18363.1440)-> 调试和发布:
1717.789063
- 版本 2004(OS 内部版本 19041.867)-> 调试:
1717.789063
发布:1717.789062
新版本Debug和Release结果不一样的原因是什么?我怎样才能修复它以使两个版本的结果相同?
加法:
代码:
#include <stdio.h>
int main()
{
double f = 0.25;
printf( "%.1f", f );
return 0;
}
在新旧 Win10 版本上具有相同的行为。我建议,这是更新 ucrtbase.dll 版本
中的一个错误
我找到了 windows 版本和 debug/release 模式之间程序如此不同行为的原因。
新的 windows 更新(19041.* 如果我理解正确的话)改变了浮点类型的小数部分的舍入规则:以前它在以 5 结尾的情况下舍入到更大:1.25 -> 1.3
,但现在四舍五入到最接近的偶数:1.25 -> 1.2
、1.35 -> 1.4
.
要了解新 Win 10 版本的调试和发布之间的区别,需要注意 ucrtbase.dll 使用和更新规则。
- 每个应用程序的调试和发布版本使用 ucrtbase.dll 或 ucrtbased.dll C:\Windows\System32 或 C:\Windows\SysWOW64
- 它是发布版本 (ucrtbase.dll) 是 Windows10 的一部分,只能更新Windows 更新。但它的调试版本 (ucrtbased.dll) 不会随着 Win 10 更新而更新,但可以通过安装更新的 Windows 10 SDK 来更新(例如,在 Visual Studio安装程序)。
因此,解决方案是在新的 Windows 10 版本上安装新的 Windows 10 SDK 以实现相同的行为,或者将 printf() 函数切换为 fmt::printf() 函数https://github.com/fmtlib/fmt,例如,使所有 windows 版本的结果相同。
#include <stdio.h>
int main()
{
float f = 1717.7890625;
printf( "%.6f", f );
return 0;
}
我用 Visual Studio 19 (16.9.2) 为 x64 arch 编译了这段代码,运行 在我的两台 Windows 10 台电脑上得到了结果:
- 版本 1909(OS 内部版本 18363.1440)-> 调试和发布:
1717.789063
- 版本 2004(OS 内部版本 19041.867)-> 调试:
1717.789063
发布:1717.789062
新版本Debug和Release结果不一样的原因是什么?我怎样才能修复它以使两个版本的结果相同?
加法: 代码:
#include <stdio.h>
int main()
{
double f = 0.25;
printf( "%.1f", f );
return 0;
}
在新旧 Win10 版本上具有相同的行为。我建议,这是更新 ucrtbase.dll 版本
中的一个错误我找到了 windows 版本和 debug/release 模式之间程序如此不同行为的原因。
新的 windows 更新(19041.* 如果我理解正确的话)改变了浮点类型的小数部分的舍入规则:以前它在以 5 结尾的情况下舍入到更大:1.25 -> 1.3
,但现在四舍五入到最接近的偶数:1.25 -> 1.2
、1.35 -> 1.4
.
要了解新 Win 10 版本的调试和发布之间的区别,需要注意 ucrtbase.dll 使用和更新规则。
- 每个应用程序的调试和发布版本使用 ucrtbase.dll 或 ucrtbased.dll C:\Windows\System32 或 C:\Windows\SysWOW64
- 它是发布版本 (ucrtbase.dll) 是 Windows10 的一部分,只能更新Windows 更新。但它的调试版本 (ucrtbased.dll) 不会随着 Win 10 更新而更新,但可以通过安装更新的 Windows 10 SDK 来更新(例如,在 Visual Studio安装程序)。
因此,解决方案是在新的 Windows 10 版本上安装新的 Windows 10 SDK 以实现相同的行为,或者将 printf() 函数切换为 fmt::printf() 函数https://github.com/fmtlib/fmt,例如,使所有 windows 版本的结果相同。