【发布时间】:2011-01-10 09:22:28
【问题描述】:
如果 Long Integer 和 float 都需要 4 个字节来存储在内存中,那么为什么它们的范围不同?
【问题讨论】:
标签: c++ c architecture floating-point types
如果 Long Integer 和 float 都需要 4 个字节来存储在内存中,那么为什么它们的范围不同?
【问题讨论】:
标签: c++ c architecture floating-point types
整数的存储方式如下:
浮点数的存储方式不同,以牺牲准确性为代价提供更大的范围:
浮点数以指数形式表示:(+/-)S*(base)^E
顺便说一句,“长”并不总是 32 位。见this article。
【讨论】:
编码数字的不同方式。
Long 从 1 计数到 2^(4*8)。
浮点数仅使用 32 位中的 23 位进行“计数”。但它在其他位中添加了带有指数的“范围”。所以你有更大的数字,但它们不太准确(在较低的基础部分):
1.2424 * 10^54(尾数 * 指数)肯定大于 2^32。但是您可以从长 2^31-1 中辨别出长 2^31,而您无法辨别浮点 1.24 * 10^54 和浮点 1.24 * 10^54 - 1:在这种表示中,1 只是丢失了浮动。
【讨论】:
它们的大小并不总是相同。但即使它们是,它们的范围也是不同的,因为它们服务于不同的目的。一种用于无小数位的整数,一种用于小数。
【讨论】:
这可以解释为什么浮点表示可以表示比定点表示更大范围的数字。本文来自Wikipedia entry:
浮点的优势 定点表示(和 整数)表示是它可以 支持更广泛的价值观。 例如,一个固定点 有七位小数的表示 数字,假定小数点 定位在第五个之后 数字,可以表示数字 12345.67、8765.43、123.00 等,而浮点数 表示(如 IEEE 754 decimal32 格式),带七位小数 数字还可以代表 1.234567、123456.7、0.00001234567、1234567000000000 等。这 浮点格式需要稍微 更多存储空间(对位置进行编码 小数点的),所以当存储在 相同的空间,浮点数 在实现他们更大的范围 牺牲精度。
【讨论】:
一个浮点数确实需要 4 个字节(32 位),但由于它是一个浮点数,因此您必须在这 32 位中存储不同的内容:
您可以看到,浮点数的范围直接取决于分配给有效数字的位数,而最小值/最大值取决于分配给指数的位数。
上面的例子:
对于长整数,您有 1 位用于符号,然后 31 位用于表示导致最大值为 2 147 483 647 的整数值。
您可以查看 Wikipedia 以获取更准确的信息: Wikipedia - Floating point
【讨论】:
它们的范围不同,因为它们使用不同的数字表示方式。
long (c) 等价于long int。这种类型的大小因处理器和编译器而异,但正如您所说,通常是 32 位。在 32 位上,它可以表示 232 个不同的值。由于我们经常要使用负数,因此计算机通常使用称为“two's complement”的格式来表示整数。这样,我们可以表示从 (-231) 到 (231-1) 的数字。算上数字 0,总共有 232 个数字。
float(在 c 中)通常是单个精度 IEEE 754 格式的数字。在 32 位上,这种数据类型也可以采用 232 个不同的位模式,但它们不用于直接表示整数,就像在 long 中一样。相反,它们代表一个符号,以及一个标准化十进制数的尾数和指数。
【讨论】:
float 可以,但不必是 IEEE754。如果是,则它没有 2^32 值。 bitpattern只有2^32个,有些值(比如0)可以用多个bitpattern来表示。
一般来说:当你有更多的值范围时(float 最多有 10^many),你的精度就会降低。
这就是这里发生的事情。如果您需要整数,32 位长会提供更多。
【讨论】:
在handwavey 高级中,浮点会牺牲整数精度来扩展其范围。这是通过将基值与比例因子相结合来完成的。对于大值,浮点数无法精确表示所有整数,但对于小值,它比整数精度更好。
【讨论】:
不,C 中原始数据类型的大小是实现定义的。
This wiki 条目明确指出:The floating-point format needs slightly more storage (to encode the position of the radix point), so when stored in the same space, floating-point numbers achieve their greater range at the expense of precision.
【讨论】:
long int 和 float 占用 4 个字节的事实。