EMP*_*EMP 7 c python floating-point precision printf
我在输出浮点数时遇到了一个恼人的问题.当我在Windows上格式化11.545,精度为2小数点时,它输出"11.55",正如我所料.但是,当我在Linux上做同样的事情时,输出是"11.54"!
我最初在Python中遇到了这个问题,但进一步的调查表明,差异在于底层的C运行时库.(该体系结构是x86的64在两种情况下.)运行C的下面的行上产生Windows和Linux的不同的结果,同样因为它在Python.
printf("%.2f", 11.545);
Run Code Online (Sandbox Code Playgroud)
为了更多地了解这一点,我将数字打印到20位小数("%.20f"):
Windows: 11.54500000000000000000
Linux: 11.54499999999999992895
Run Code Online (Sandbox Code Playgroud)
我知道11.545不能精确地存储为二进制数.所以似乎正在发生的事情是Linux以最佳精度输出实际存储的数字,而Windows输出最简单的十进制表示,即.试图猜测用户最有可能的意思.
我的问题是:是否有任何(合理的)方法来模拟Windows上的Linux行为?
(虽然Windows的行为当然是直观的,但在我的情况下,我实际上需要将Windows程序的输出与Linux程序的输出进行比较,而Windows是唯一可以更改的.顺便说一下,我试过查看Windows源代码printf,但执行float-> string转换的实际函数是,_cfltcvt_l并且其源代码似乎不可用.)
编辑:情节变厚!关于这种由不精确表示引起的理论可能是错误的,因为0.125确实具有精确的二进制表示,并且当输出时它仍然不同'%.2f' % 0.125:
Windows: 0.13
Linux: 0.12
Run Code Online (Sandbox Code Playgroud)
但是,round(0.125, 2)在Windows和Linux上都返回0.13.
考虑将浮点数与一定的容差/epsilon 进行比较。这比尝试精确匹配要稳健得多。
我的意思是,除了在以下情况下两个浮点数相等之外:
f1 == f2
Run Code Online (Sandbox Code Playgroud)
在以下情况下称它们相等:
fabs(f1 - f2) < eps
Run Code Online (Sandbox Code Playgroud)
对于一些小的eps. 有关此问题的更多详细信息可以在此处找到。