首先,我想指出我不是母语人士,我真的需要一些更常用的术语。
我想提到的第二件事是,我不是一个数学天才。我真的在努力理解关于编程的一切。但是IEEE-754让我觉得它永远不会快乐。它充满了我不明白的数学术语。
什么是精度?它的用途是什么?什么是尾数,尾数是做什么用的?如何通过其大小确定float
/double
的范围?±符号(加减号(有什么用?(我相信它的积极/消极选择,但这与一切有什么关系?
你们没有可以给我任何简短而干净的解释吗?我花了600年的时间试图理解维基百科。我失败得非常惨重。
什么是精度?
它是指二进制浮点表示可以表示实际值的接近程度。实值具有无限的精度和无限的范围。数字值的范围和精度有限。 实际上,单精度 IEEE-754 可以表示精度为 6 个有效数字(十进制(的实际值,而双精度适用于 15 个有效数字。
例如,这样做的实际效果是单个精度值:123456000.00
不能与123456001.00
区分开来,但同样可以表示值 0.00123456。
它的用途是什么?
精度除了定义特定浮点表示的特征外,不用于任何其他用途。
什么是尾数,尾数是做什么用的?
该术语在英语维基百科文章中没有提及,并且不精确 - 在数学中,它与此处使用的含义不同。
正确的术语是有意义的。 例如,对于十进制值0.00123456
有效数为 123456
。 123456000.00
具有完全相同的意义。 这些值中的每一个都具有相同的有效值,但指数不同。 指数是一个比例因子,用于确定小数点的位置(因此是浮点(。
当然IEEE754是一个二进制浮点表示,而不是十进制,但对于术语的相同解释,使用十进制可能更容易。
如何通过其大小确定浮点/双精度的范围?
仅凭大小是不能的;你需要知道有多少位分配给有效位数,有多少位分配给指数。 然而,在 C 语言中,范围由 float.h 标头中的宏FLT_MIN
、FLT_MAX
、DBL_MIN
和 DBL_MAX
定义。 浮点表示的实现的其它特征也在这里描述。
请注意,特定的编译器实际上可能不使用IEEE754,但这是大多数硬件 FPU 实现使用的格式,编译器自然会遵循该格式。 对于没有 FPU(通常是小型嵌入式处理器(的目标,可以使用其他格式。
±符号(加减号(有什么用?
它只是意味着给定的值可能是正数或负数。 它可以指特定值,也可以指示范围。 因此,±n 可以指两个离散值 -n 或 +n,也可能表示范围 -n 到 +n。 语境就是一切! 在本文中,它指的是离散值 +0、-0、+∞ 和 -∞。
有 3 个不同的组成部分:符号、指数、尾数
假设指数只有 2 位,则可能有 4 种组合:
binary decimal
00 0
01 1
10 2
11 3
表示的浮点值为 2指数:
binary exponent-value
00 2^0 = 1
01 2^1 = 2
10 2^2 = 4
11 2^3 = 8
浮点值的范围,由指数产生。 2 位 =>最大值 = 8。
尾数将范围从给定指数划分为下一个更高指数。例如,指数为 2,尾数为一位,则可能有两个值:
exponent-value mantissa-binary represented floating-point value
2 0 2
2 1 3
表示的浮点值为 2指数× (1 + m1×2-1 + m2×2-2 + m3×2-3 + ...(。这里有一个3位尾数的例子:
exponent-value mantissa-binary represented floating-point value
2 000 2 * (1 ) = 2
2 001 2 * (1 + 2^-3) = 2,25
2 010 2 * (1 + 2^-2 ) = 2,5
2 011 2 * (1 + 2^-2 + 2^-3) = 2,75
2 100 2 * (1 + 2^-1 ) = 3
and so on…
该符号只有一个位:
0 ->正值
1 ->负值
在 IEEE-754 中,32 位浮点数据类型具有 8 位指数(范围从 2-127 到 2128(和 23 位尾数。
1 10000010 01101000000000000000000
- 130 1,40625
表示的浮点值为:
-1 × 2(130 – 127( × (1 + 2-2 + 2-3 + 2-5( = -11,25
一试:http://www.h-schmidt.net/FloatConverter/IEEE754.html