【发布时间】:2021-03-22 16:37:32
【问题描述】:
#include <stdio.h>
int main()
{
float f = 1717.7890625;
printf( "%.6f", f );
return 0;
}
我使用 Visual Studio 19 (16.9.2) for x64 arch 编译了这段代码,并在我的两台 Windows 10 PC 上运行了结果:
- 版本 1909(操作系统内部版本 18363.1440)-> 调试和发布:
1717.789063 - 2004 版(操作系统内部版本 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 版本中的错误
【问题讨论】:
-
使用
1717.7890625f有什么不同吗?您现在正在为浮点数分配双精度(IIRC)。 -
我不认为任何一种行为(向上舍入或向下舍入)都值得“破坏”一词;任何一种行为都是有效的。
-
可能发布版本优化了
f并直接使用双精度值。调试版本会将双精度值存储到浮点数中(截断它),然后将其转换回双精度值以传递给printf。如果使用cout而不是printf,会得到什么结果? -
事实上,如果您转到h-schmidt.net/FloatConverter,您会发现 1717.7890625 完全可以用 IEEE 32 位浮点数表示。可能是由于一些库更改 - 1909 与 2004 上安装的内容,以及调试与发布的一些不幸差异,可能与浮点标志(您通常从不接触)有关。
-
1717.789063f和1717.789062f的数字对于floats 是相同的,1717.789063f == 1717.789062f将评估为 true。
标签: c windows-10 printf