Re: [问题] 请问c的float和double的资料范围

楼主: LPH66 (-6.2598534e+18f)   2021-02-02 14:58:23
※ 引述《cch123 (cch123)》之铭言:
: 看了几本书和网络资料,说法都不同,
: 请问有标准答案吗?谢谢
: https://i.imgur.com/DJWYiNl.jpg
: https://i.imgur.com/F9SzirG.jpg
: https://i.imgur.com/NhOQrUG.jpg
以下我先讲 IEEE754 规定
现在的 C/C++ 用的 float/double 大多都跟这个规定走但也不是绝对
====
首先, 所谓的浮点数
骨子里其实就是二进制、有限有效位数、指数也有限定范围的科学记号
单精确度有 23+1 位有效位数, 指数限定为 2 的 -126 到 +127 次方
倍精确度有 52+1 位有效位数, 指数限定为 2 的 -1022 到 +1023 次方
加上浮点数有正负, 所以两端的极限值会是绝对值最大的值
单精确度就是 1.111111...111 * 2^127
转换成十进制的话, 小数点后面有 23 个 1
所以乘号前面的值是 1 + 2^(-1) + 2^(-2) + ... + 2^(-23) = 2 - 2^(-23)
乘上指数之后就是 2^128 - 2^104 = 340282346638528859811704183484516925440
这就是 3.402823*10^38 的由来; 这个值在 C/C++ 里可用 FLT_MAX 叫出来
倍精确度类似, 两端的极限值是
(2 - 2^(-52)) * 2^1023 = 2^1024 - 2^971
= 179769313486231570....184124858368
这就是 1.79769313486232*10^308 这个数, C/C++ 里叫 DBL_MAX
同样地, 绝对值最小的非 0 数可以类似地算出来
单精确度是 1.0000...000 * 2^-126
= 1.17549435082228750796873653722224567781866555
67720875215087517062784172594547271728515625 * 10^(-38) (FLT_MIN)
倍精确度是 1.0000...000 * 2^-1022
≒ 2.22507385850720138309023271733240406421921598... * 10^(-308) (DBL_MIN)
这两个数字有列在第二张图里, 这就是它们的来源
====
不过这种表示法造成了一个问题:
当接近这个最小绝对值的数进行运算时
其产生的结果可能因为指数太小放不下直接变成 0
也就是在上面那个最小绝对值以下就直接切成 0 了 (这个叫做 underflow, 下溢)
为了补足这部份的运算精确, 所以定义了 subnormal number
在科学记号的表示法当中, 为了迁就指数的范围而不使前面数字正规化
以单精确度为例, 强制使指数停在 2^(-126) 次方而不让前面正规化为 1.xxxx
所以就能出现 0.0000000....0001 * 2^(-126) 这个最小值
转成十进制就是 2^(-23) * 2^(-126) = 2^(-149)
≒ 1.4012984643248170709237295832899... * 10^-45 (FLT_TRUE_MIN [C11/C++11])
同理倍精确度就是 0.00000....0001 * 2^(-1022)
= 2^(-52) * 2^(-1022) = 2^(-1074)
≒ 4.9406564584124654417656879286822... * 10^-324 (DBL_TRUE_MIN [C11/C++11])
这就是第三张图里的范围来源
====
前两张图里还有列出一个更“大”的 long double
但这个型别实际上是什么也要看编译器怎么定, 标准只说它是 "extened precision"
第一张图里它跟 double 根本就一样大
第二张图里它是一个占 80-bit 的型态, 这个并不在 IEEE754 的规范里
所以它们的范围也就是各自说了算
实际上在你用的编译器里的范围是多少可以叫用类似的常数出来
分别是 LDBL_MAX, LDBL_MIN, LDBL_TRUE_MIN 对应上面的三种极限值
那个 80-bit 的型态使用的是 63+1 位有效位数, 指数是 2 的 -16382 到 +16383 次方
你可以用类似的方法去推算极限值是不是符合上面第二张图的数值
====
这篇因为纯讲范围, 所以没有提到实际上这个范围是怎么定的
这跟浮点数的位元实际是怎么组织的有关
但这些都和原 PO 的问题范围离的稍微远一点所以全部略过

Links booklink

Contact Us: admin [ a t ] ucptt.com