Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Floating point 精度、范围、负值浮动_Floating Point_Precision - Fatal编程技术网

Floating point 精度、范围、负值浮动

Floating point 精度、范围、负值浮动,floating-point,precision,Floating Point,Precision,我试图弄清楚浮点和双精度在C语言中是如何工作的,但我在很多方面都感到困惑。以下是我的问题: 我的书告诉我浮点的最大值是1038。然而,它的准确度只有1010。在1011,计算机给了我一个近似值,而不是精确值。这种精度限制是从哪里来的?为什么不提及 当最大范围1038不准确时,调用它有什么意义 int和float都占用了4个字节的内存,但它们的范围却大不相同。为什么呢 浮动范围为10-38至1038,但也可能出现负值。为什么? 我非常感谢能在这里得到的任何帮助。我对C语言比较陌生,所以在解释时请记

我试图弄清楚浮点和双精度在C语言中是如何工作的,但我在很多方面都感到困惑。以下是我的问题:

  • 我的书告诉我浮点的最大值是1038。然而,它的准确度只有1010。在1011,计算机给了我一个近似值,而不是精确值。这种精度限制是从哪里来的?为什么不提及

  • 当最大范围1038不准确时,调用它有什么意义

  • int
    float
    都占用了4个字节的内存,但它们的范围却大不相同。为什么呢

  • 浮动范围为10-38至1038,但也可能出现负值。为什么?


  • 我非常感谢能在这里得到的任何帮助。我对C语言比较陌生,所以在解释时请记住这一点。

    请阅读维基百科页面。它完美地回答了你的问题
    只要看看维基百科页面就行了。它完美地回答了你的问题

    我将尝试笼统地回答,没有具体和血淋淋的细节,也不受特定浮点标准的约束。如果您对这些感兴趣,您应该熟悉IEEE 754浮点标准——这是一项艰巨的任务。虽然C/C++实现不需要遵循它,但它们通常会遵循它,而且对于对该主题感兴趣的人来说,它是一个值得理解的创作性源代码

    首先,一般浮点数表示为两个不同的部分-有效数字和指数。对于熟悉科学符号的人来说,这很容易理解。在科学记数法中,
    42.42
    可以表示为
    4242*10^-2
    。(其中,
    ^-2
    表示10乘以-2的幂。)这里,
    4242
    是所谓的有效数,-2是指数,10是指数基数

    同样的想法可以用二进制表示编码。您只需将一些位去符号化以表示有效部分,一些位表示指数,一些位表示基数(或默认基数)

    实际上,浮点数的二进制表示形式可能如下所示:

    [5位表示有效位的位数][2位表示有效位的位数 编码基][有效位][指数位]

    这种方案允许在相同的比特量下编码比整数编码大得多的数字。有可能,使用32位及以上的方案,一个人可以将数字编码到10^(2^25)!比用简单的32位整数表示的数字大得多

    然而,它有它的成本。数字越大(以模数表示)或越接近零,用于指数的位数就越多(表示大的幂!),用于有效值的位数就越少。但是这样你总是会失去精度——仅仅是因为有(非常)有限的数字,可以用,比如说,八位来表示


    这差不多就是总结。剩下的是生成数字、选择基数和指数、对表示进行四舍五入等规则。

    我将尝试笼统地回答,没有具体和血淋淋的细节,也不受特定浮点标准的约束。如果您对这些感兴趣,您应该熟悉IEEE 754浮点标准——这是一项艰巨的任务。虽然C/C++实现不需要遵循它,但它们通常会遵循它,而且对于对该主题感兴趣的人来说,它是一个值得理解的创作性源代码

    首先,一般浮点数表示为两个不同的部分-有效数字和指数。对于熟悉科学符号的人来说,这很容易理解。在科学记数法中,
    42.42
    可以表示为
    4242*10^-2
    。(其中,
    ^-2
    表示10乘以-2的幂。)这里,
    4242
    是所谓的有效数,-2是指数,10是指数基数

    同样的想法可以用二进制表示编码。您只需将一些位去符号化以表示有效部分,一些位表示指数,一些位表示基数(或默认基数)

    实际上,浮点数的二进制表示形式可能如下所示:

    [5位表示有效位的位数][2位表示有效位的位数 编码基][有效位][指数位]

    这种方案允许在相同的比特量下编码比整数编码大得多的数字。有可能,使用32位及以上的方案,一个人可以将数字编码到10^(2^25)!比用简单的32位整数表示的数字大得多

    然而,它有它的成本。数字越大(以模数表示)或越接近零,用于指数的位数就越多(表示大的幂!),用于有效值的位数就越少。但是这样你总是会失去精度——仅仅是因为有(非常)有限的数字,可以用,比如说,八位来表示

    这差不多就是总结。剩下的是生成数字、选择基数和指数、对表示进行四舍五入等规则

  • 因为“它们是如何在内部表示的”,所以它给出了近似值。 看到这个了吗

  • 你们看,这种近似只在少数情况下出现,所以说范围不准确是错误的

  • 不同的范围,因为它们具有不同的表示形式。看这个

  • 因为“它们是如何在内部表示的”,所以它给出了近似值。 看到这个了吗

  • 你们看,这种近似只在少数情况下出现,所以说范围不准确是错误的

  • 不同的范围,因为它们具有不同的表示形式。看这个


  • 这与其说是C/C++问题,不如说是一般问题