【发布时间】: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
这让谜团变得更大了! 感谢您的帮助,希望我清楚。
【问题讨论】:
-
我建议您对the IEEE754 floating point representation 进行一些研究。虽然值很大,但不是很精确(超过一定限度,浮点值的精度会显着下降)。
-
在我第一次阅读之后,有很多有趣的东西,但仍然误解如何将 39 位十进制数字存储在 32 位(实际上对于尾数来说更少)位。在维基百科中,他们谈到了超过 64 位的浮点值,这可能是一种解释,但他们仍然谈到单精度和双精度的 32 或 64 位。在一个数组中,他们说 7.22 十进制数字表示单精度,为什么我有 39 ?
-
如果您阅读更多关于 single precision 的信息,您将看到最大值为 ±(1−2⁻²⁴ ) × 2¹²⁸ ≈ ±3.40282×10³⁸。这确实是您看到的最大价值。
标签: c memory double limit precision