使用下面给出的 C 代码(在 Visual Studio 中编写):
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
float i = 2.0/3.0;
printf("%5.6f", i);
return 0;
}
产生输出: 0.666667
但是,当 %5.6f 更改为 %5.20f 时,输出更改为: 0.66666668653488159000
我的问题是为什么类似小数的输出会发生细微变化?
最佳答案
当您使用 32 位 float 时,计算机将 2./3.
的结果表示为 11,184,811/16,777,216,正好是 0.666666686534881591796875。在您使用的 float 中,数字始终表示为某个整数乘以 2 的某个幂(可能是 2 的负幂)。由于整数的大小限制(当您使用 float
时,整数必须适合 24 位,不包括符号),最接近 2/3 的可表示值是 11,184,811/16,777,216。
带有 '%5.6f` 的 printf
显示“0.666667”的原因是因为“%5.6f”只要求六位数字,所以数字在第六位四舍五入。
带有 %5.20f
的 printf
显示“0.66666668653488159000”的原因是您的 printf
实现在 17 位数字后“放弃”,计算这在某种意义上已经足够接近了。 printf
的某些实现(有人可能会争论说更好)会在请求的格式允许的情况下尽可能接近地打印表示的值。在这种情况下,它们会显示“0.66666668653488159180”,如果您要求更多数字,它们会显示确切的值“0.666666686534881591796875”。
( float 格式通常表示为符号、1[含]和2[不含]之间的小数和指数,而不是符号、整数和指数。在数学上,它们是与指数调整相同:每个可以用符号、24 位无符号整数和指数表示的数字等于某个带符号、1 到 2 之间的小数和调整指数的数字。使用整数版本倾向于使证明更容易,有时有助于解释。)
关于c - 为什么输出不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17151250/