【问题标题】:C, FLT_MAX value larger than 32 bits?C、FLT_MAX值大于32位?
【发布时间】:2019-04-16 07:09:44
【问题描述】:

我实际上正在研究如何显示一个浮点数(带写),我正面临着一些让我困惑的事情。

我发现浮点数以 32 位存储,其中 1 位用于符号,7 位用于指数,其余用于尾数。

我的麻烦来了,当我用 printf 显示 FLT_MAX 时,我会得到340282346638528859811704183484516925440.000000 printf("%f\n", FLT_MAX)

这个值大于INT_MAX,大于LLONG_MAX,这个数字怎么能存储在32位?这真的是 32 位还是取决于系统?我在 Ubuntu x86_64 GNU/Linux

我无法理解如何以相同的位数存储超过 10 个数字 (INT_MAX len)。

如果认为问题有关联,但我也有麻烦给我加倍的麻烦

printf("%lf", DBL_MAX);
#179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000

这让谜团变得更大了! 感谢您的帮助,希望我清楚。

【问题讨论】:

标签: c memory double limit precision


【解决方案1】:

位只是具有两种状态的物理事物。它们没有内在的意义。当我们使用这些位来表示二进制整数时,我们将每个位解释为具有一个值,1 表示一位,2 表示另一位,4 表示另一位,8 表示另一位,依此类推。物理学、逻辑学或法律中没有任何东西需要我们给他们这样的解释。

当我们使用位来表示浮点对象时,我们赋予每个位不同的含义。一位代表符号。八位包含指数的编码。 23 位包含有效数字的编码。

为了弄清楚给定浮点编码方案中正常范围内数字的位的含义,我们将指数位解释为二进制数字,然后减去 127,然后将结果提高 2 次方。 (比如“10000011”是131的二进制数,所以表示24)然后我们把有效位加到“1.”后面,形成一个二进制数如“1.01011100000000000000000” ”。我们将该数字转换为数字(即 159/128),然后将其乘以指数的幂(在本例中为 159/8)并应用符号。

由于指数可以很大,所以表示的值可以很大。将浮点数转换为字符以输出的软件,例如“340282346638528859811704183484516925440.000000”为您执行这些解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-14
    • 2012-11-16
    • 1970-01-01
    • 2018-05-15
    • 2011-04-23
    • 1970-01-01
    • 2012-03-13
    • 2014-11-22
    相关资源
    最近更新 更多