为什么输出的差异?

ana*_*kin 1 c floating-point

使用下面给出的C代码(用Visual Studio编写):

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    float i = 2.0/3.0;
    printf("%5.6f", i);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产生输出:0.666667

但是当%5.6f更改为%5.20f时,输出将更改为:0.66666668653488159000

我的问题是为什么类似小数的输出的细微变化?

Eri*_*hil 5

当您使用32位浮点数时,计算机表示结果2./3.为11,184,811/16,777,216,正好是0.666666686534881591796875.在您使用的浮点数中,数字总是表示为某个整数乘以2的幂(可能是2的负幂).由于限制了整数的大小(当你使用时float,整数必须适合24位,不包括符号),最接近2/3的可表示值是11,184,811/16,777,216.

之所以printf用"%5.6f`显示'0.666667’,是因为'%5.6F’的要求只是六位数字,因此数字在第六位四舍五入.

之所以说printf%5.20f显示"0.66666668653488159000"是你printf实施后17位"放弃",盘算,在某种意义上是足够接近.有人printf可能认为更好的一些实现,将所表示的值打印为所请求的格式允许的那样.在这种情况下,它们将显示"0.66666668653488159180",如果您请求更多数字,它们将显示确切的值"0.666666686534881591796875".

(浮点格式通常表示为符号,1 [包含]和2 [不包含]之间的分数,以及指数,而不是符号,整数和指数.数学上,它们与指数中的调整:每个用符号表示的数字,24位无符号整数和指数等于带符号的某个数字,1到2之间的分数,以及调整后的指数.使用整数版本倾向于证明更容易,有时有助于解释.)