精度、范围、负值浮动
Precision, range, negative values float
我试图弄清楚浮点数和双精度数在 C 中是如何工作的,但我在很多层面上都感到困惑。这是我的问题:
我的书告诉我浮点数的最大值是 1038。然而,它最多只能精确到 1010。在1011,电脑给我一个大概值,不是准确值。这个精度限制是从哪里来的,为什么没有提到呢?
调用最大范围1038有什么意义呢?
int
和 float
都占用 4 个字节的内存,但它们的范围却大不相同。这是为什么?
浮点数的范围是 10-38 到 1038,但也可以是负值。为什么?
非常感谢能在这里得到的任何帮助。我对C比较陌生,所以在解释时请记住这一点。
只需阅读维基百科页面。它完美地回答了你的问题
here
我将尝试笼统地回答,没有具体和血腥的细节,也不受特定浮点标准的约束。如果您对这些感兴趣,您应该熟悉 IEEE 754 浮点标准——一项艰巨的任务。虽然 C/C++ 实现不需要遵循它,但它们通常会遵循它,对于对该主题非常感兴趣的人来说,这是一个值得理解的权威来源。
首先,一般浮点数被表示为两个不同的部分——有效数和指数。对于熟悉科学计数法的人来说,这很容易理解。在科学记数法中,42.42
可以表示为4242 * 10 ^ -2
。 (其中^ -2
表示10的-2次方。)这里4242
就是所谓的显着数, -2 是指数,10 是指数底。
同样的想法可以用二进制表示进行编码。您只需指定一些位来表示重要部分,一些位来表示指数,一些位来表示底数(或默认您的底数)。
实际上,浮点数的二进制表示可能如下所示:
[5 bits to indicate how many bits for significant] [2 bits to
encode base] [significant bits] [exponent bits]
并且这种方案允许在相同数量的比特中编码比整数编码大得多的数字。潜在地,使用 32 位及以上的方案可以编码最多 10 ^ (2 ^ 25) 的数字!比用简单的 32 位整数表示的数字大得多!
然而,它有它的成本。数字越大(模数)或越接近零,用于指数的位数就越多(以表示大功率!),而用于显着的位数越少。但是有了这个你总是会失去精度 - 仅仅是因为有一个(非常)有限的数字可以用八位来表示。
总结得差不多了。剩下的就是生成数字、选择底数和指数、四舍五入等的规则。
因为"how they are represented internally"所以给你大概的值。
看到这个 Is floating point math broken?
你看这种近似只在少数情况下出现,所以说范围不准确是错误的。
不同的范围,因为它们有不同的表示。看到这个 Size of int and float.
参见 this。
我试图弄清楚浮点数和双精度数在 C 中是如何工作的,但我在很多层面上都感到困惑。这是我的问题:
我的书告诉我浮点数的最大值是 1038。然而,它最多只能精确到 1010。在1011,电脑给我一个大概值,不是准确值。这个精度限制是从哪里来的,为什么没有提到呢?
调用最大范围1038有什么意义呢?
int
和float
都占用 4 个字节的内存,但它们的范围却大不相同。这是为什么?浮点数的范围是 10-38 到 1038,但也可以是负值。为什么?
非常感谢能在这里得到的任何帮助。我对C比较陌生,所以在解释时请记住这一点。
只需阅读维基百科页面。它完美地回答了你的问题 here
我将尝试笼统地回答,没有具体和血腥的细节,也不受特定浮点标准的约束。如果您对这些感兴趣,您应该熟悉 IEEE 754 浮点标准——一项艰巨的任务。虽然 C/C++ 实现不需要遵循它,但它们通常会遵循它,对于对该主题非常感兴趣的人来说,这是一个值得理解的权威来源。
首先,一般浮点数被表示为两个不同的部分——有效数和指数。对于熟悉科学计数法的人来说,这很容易理解。在科学记数法中,42.42
可以表示为4242 * 10 ^ -2
。 (其中^ -2
表示10的-2次方。)这里4242
就是所谓的显着数, -2 是指数,10 是指数底。
同样的想法可以用二进制表示进行编码。您只需指定一些位来表示重要部分,一些位来表示指数,一些位来表示底数(或默认您的底数)。
实际上,浮点数的二进制表示可能如下所示:
[5 bits to indicate how many bits for significant] [2 bits to encode base] [significant bits] [exponent bits]
并且这种方案允许在相同数量的比特中编码比整数编码大得多的数字。潜在地,使用 32 位及以上的方案可以编码最多 10 ^ (2 ^ 25) 的数字!比用简单的 32 位整数表示的数字大得多!
然而,它有它的成本。数字越大(模数)或越接近零,用于指数的位数就越多(以表示大功率!),而用于显着的位数越少。但是有了这个你总是会失去精度 - 仅仅是因为有一个(非常)有限的数字可以用八位来表示。
总结得差不多了。剩下的就是生成数字、选择底数和指数、四舍五入等的规则。
因为"how they are represented internally"所以给你大概的值。 看到这个 Is floating point math broken?
你看这种近似只在少数情况下出现,所以说范围不准确是错误的。
不同的范围,因为它们有不同的表示。看到这个 Size of int and float.
参见 this。