我试图弄清楚C中的浮动和双打是如何工作的,但我在很多层面上都很困惑。以下是我的问题:
我的书告诉我浮动的最大值是10 ^ 38。然而,它只能精确到10 ^ 10。在10 ^ 11,计算机给出了一个近似值,而不是确切的值。这种精度限制来自何处,为什么没有提到?
如果最大范围10 ^ 38不准确,有什么意义?
int和float都占用了4个字节的内存,但它们的范围大不相同。那是为什么?
浮点数的范围是10 ^ -38到10 ^ 38,但负值是可能的。为什么呢?
我非常感谢我能得到的任何帮助。我对C来说比较新,所以在解释时请记住这一点。
答案 0 :(得分:3)
我将尝试回答一般,没有特定和血腥的细节,也不受特定浮点标准的约束。如果您对这些感兴趣,您应该熟悉IEEE 754浮点标准 - 这是一项艰巨的任务。虽然C / C ++实现不需要遵循它,但它们通常会这样做,并且它是一个值得理解的权威来源,对于对该主题深感兴趣的人。
首先,一般浮点数表示为两个不同的部分 - 有效数和指数。对于熟悉科学记数法的人来说,这很容易理解。在科学记数法中,42.42
可以表示为4242 * 10 ^ -2
。 (其中^ -2
表示 10到-2 的幂。)这里4242
是所谓的重要号,-2是指数10是指数基数。
同样的想法可以用二进制表示法编码。你只需要分配一些比特来表达重要的部分,一些比特来表达指数,一些比特来表达基数(或默认你的基数)。
实际上,浮点数的二进制表示可能如下所示:
[5位表示有效位数] [2位为 编码基数] [有效位] [指数位]
这种方案允许在相同的位数中编码比整数编码大得多的数字。潜在地,使用32位及以上方案,可以编码最多10 ^(2 ^ 25)的数字!比用简单的32位整数表示的数字要多很多!
然而,它有它的成本。数字越大(模数)或越接近零,指数使用的位越多(表示大功率!),并且较少的位数专用于显着。但是有了这个,你就会失去精确度 - 仅仅是因为有一个(非常)有限数量的数字可以用8位表示。
这几乎总结了一下。其余的是产生数字,选择基数和指数,舍入表示等的规则。
答案 1 :(得分:0)
只需阅读维基百科页面即可。它完美地回答了你的问题 here
答案 2 :(得分:0)
1)由于“它们如何在内部表示”,它给出了近似值。 见Is floating point math broken?
2)嗯,你看到这种近似仅在少数情况下发生,因此说范围不准确是错误的。
3)不同的范围因为它们具有不同的表示。请参阅此Size of int and float。
4)见this。