gpt4 book ai didi

c - 你可以在 double 中存储多大的数字,在 c 中用 float 存储?

转载 作者:太空狗 更新时间:2023-10-29 15:11:51 26 4
gpt4 key购买 nike

我想弄清楚我可以将多大的数字用作 float 和double。但它并没有按照我预期的方式存储,除了整数值。 double 应该包含 8 个字节的信息,足以容纳变量 a,但它并没有保持正确。它显示 1234567890123456768,其中最后 2 位数字不同。当我在浮点变量 b 中存储 214783648 或最后一位的任何数字时,它显示相同的值 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;

最佳答案

可以存储在浮点类型中的最大(有限)数是多少这个问题的答案是 FLT_MAXDBL_MAX for float double

然而,这并不意味着该类型可以精确地表示每个更小的数字或整数(事实上,甚至不接近)。

首先,您需要了解并非 float 的所有位都是“相等的”。 float 有一个指数(在 IEEE-754 标准 float 中为 8 位,在 double 中为 11 位)和一个尾数(分别为 floatdouble 中的 23 位和 52 位)。该数字是通过将尾数(具有隐含的前导 1 位和二进制小数点)乘以 2exponent(在对指数进行归一化后;其二进制值不直接使用)获得的。还有一个单独的符号位,因此以下内容也适用于负数。

随着指数的变化,尾数的连续值之间的距离也会发生变化,即指数越大, float 的连续可表示值越远。因此,您可以精确存储给定大小的一个数字,但不能存储“下一个”数字。还应该记住,一些看似简单的分数不能用任意数量的二进制数字精确表示(例如,1/10,十分之一,是二进制的无限重复序列,如 1/3,三分之一,十进制)。

当涉及到整数时,您可以精确地表示高达 2mantissa_bits + 1 数量级的每个整数。因此 IEEE-754 float 可以表示最大为 224 的所有整数和最大为 253double (在这些范围的后半部分,连续的浮点值恰好相隔一个整数,因为整个尾数仅用于整数部分)。可以表示单个更大的整数,但它们之间的间隔大于一个整数,即,您可以表示大于 2mantissa_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);

输出:

2**24 float = 16777216, +1 = 16777216, +2 = 16777218
2**53 double = 9007199254740992, +1 = 9007199254740992, +2 = 9007199254740994

如您所见,将 1 添加到 2mantissa_bits + 1 没有任何区别,因为结果不可表示,但添加 2 可以产生正确的答案(碰巧的是,在这个数量级上,由于乘数加倍,可表示的数字相隔两个整数)。

TL;DR IEE-754 float 可以精确表示最大为 224double 最大为 253 的所有整数,但只有一些更大的整数(可表示值的间距取决于大小)。

关于c - 你可以在 double 中存储多大的数字,在 c 中用 float 存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31339995/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com