Jin*_*kim 4 c floating-point sizeof
我想弄清楚我可以使用多少大数字作为浮点数和double.但它不存储我预期的方式,除了整数值.double应该保存8个字节的信息,足以容纳变量a,但它不能保持正确.它显示1234567890123456768最后2位数字不同.当我214783648在float变量的最后一位存储或任何数字时b,它显示相同的值214783648.这应该是极限.发生什么了?
double a;
float b;
int c;
a = 1234567890123456789;
b = 2147483648;
c = 2147483647;
printf("Bytes of double: %d\n", sizeof(double));
printf("Bytes of integer: %d\n", sizeof(int));
printf("Bytes of float: %d\n", sizeof(float));
printf("\n");
printf("You can count up to %.0f in 4 bytes\n", pow(2,32));
printf("You can count up to %.0f with + or - sign in 4 bytes\n", pow(2,31));
printf("You can count up to %.0f in 4 bytes\n", pow(2,64));
printf("You can count up to %.0f with + or - sign in in 8 bytes\n", pow(2,63));
printf("\n");
printf("double number: %.0f\n", a);
printf("floating point: %.0f\n", b);
printf("integer: %d\n", c);
return 0;
Run Code Online (Sandbox Code Playgroud)
关于什么是可以存储在浮点类型中的最大(有限)数的问题的答案将分别是FLT_MAX或者DBL_MAX用于float和double.
但是,这并不意味着该类型可以精确地表示每个较小的数字或整数(事实上,甚至不接近).
首先,您需要了解浮点数的所有位都不是"相等".浮点数具有指数(8位IEEE-754标准float,11位double)和尾数(分别为23和52位float,double分别为).通过将尾数(具有隐含的前导1位和二进制点)乘以2 指数(在对指数进行归一化之后;其二进制值不直接使用)来获得该数字.还有一个单独的符号位,因此以下内容也适用于负数.
随着指数改变,尾数的连续值之间的距离也改变,即,指数越大,浮点数的连续可表示值越远.因此,您可以精确地存储给定幅度的一个数字,但不能存储"下一个"数字.人们还应该记住,一些看似简单的分数不能用任意数量的二进制数字精确表示(例如,1/10十分之一,是二进制的无限重复序列,如1/3三分之一,十进制).
当涉及到整数时,您可以精确地表示最多2个尾数_位+ 1个幅度的每个整数.因此,IEEE-754 float可以表示最多2 24和double最多2 53的所有整数(在这些范围的后半部分中,连续浮点值恰好是一个整数,因为整个尾数仅用于整数部分) .有迹象表明,可以表示单独的更大的整数,但它们相互隔开一个以上的整数,即,可以代表一些整数大于2个mantissa_bits + 1,但每整数只到该幅度.
例如:
float f = powf(2.0f, 24.0f);
float f1 = f + 1.0f, f2 = f1 + 2.0f;
double d = pow(2.0, 53.0);
double d1 = d + 1.0, d2 = d + 2.0;
(void) printf("2**24 float = %.0f, +1 = %.0f, +2 = %.0f\n", f, f1, f2);
(void) printf("2**53 double = %.0f, +1 = %.0f, +2 = %.0f\n", d, d1, d2);
Run Code Online (Sandbox Code Playgroud)
输出:
2**24 float = 16777216, +1 = 16777216, +2 = 16777218
2**53 double = 9007199254740992, +1 = 9007199254740992, +2 = 9007199254740994
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,添加1到2个mantissa_bits + 1没有任何区别,因为结果不可表示,但是添加2确实产生了正确的答案(因为在这个数量上,可表示的数字是两个整数,因为乘数已加倍).
TL; DR IEE-754 float可以精确地表示高达2 24和double高达2 53的所有整数,但只有一些更大的整数(可表示值的间距取决于幅度).
您可以使用常量来了解限制是什么:
FLT_MAX
DBL_MAX
LDBL_MAX
Run Code Online (Sandbox Code Playgroud)