对于float和double,为什么负数和正数是不对称的

本文关键字:不对称 为什么 float double 对于 | 更新日期: 2023-09-27 18:21:48

阅读MSDN,浮动范围从1E-45到1E38,双倍范围从1E-324到1E308,我想知道为什么负指数和正指数是不对称的?

对于float和double,为什么负数和正数是不对称的

您的困惑源于认为"1E-45"是一个负数。事实上,它不是一个非常小的正数:1 x 10^-45,或者更确切地说,0.000…0001,在"0"answers"1"之间有44个"0"

这代表了浮动可以存储的最小精度单位(或者类似的——如果你需要知道,其他人链接到的文章将详细解释)。

另一个数字"1E38"表示可以存储在此数据类型中的最大数字。这是1 x 10^38,或者更确切地说是10000…0000,即1后面有38 0s。

它们不是正数和负数,而是正数和负数指数。区别主要是由于规范化的工作方式。由于非正规化数字和指数偏移,您最终能够存储"较小"的数字。

最终,你基本上不需要担心这一点,但你确实需要理解正数和负数的范围是相同的(只有一个符号位)。

由于0的存在,2的补码编码的所有数值范围在设计上都是不平衡的。您可以在.NET框架中看到这一点,比如int.MaxValue=2147483647,int.MinValue=-2147483648。这就是Math.Abs(int.MinValue)抛出异常的原因。

浮点数的指数是用偏移量编码的。对于浮点,它是8位,偏移量为127,提供2^-126到2^127或1.18E-38到3.40E+38的范围(所有尾数位=1)。对于双精度,它是11位,偏移量为1023、2^-1022到2^1023或2.23E-308到1.79E+308。

通过允许浮动值为非标准化,进一步扩展了底端的范围。标准化浮点值总是以隐式1开头,而不是在尾数中编码。当一个值下降到最小可表示值以下(尾数中的所有零,编码指数=1)时,指数被设置为0以指示非正规化,隐式1不再存在。最小可能的非零浮点在尾数的最低有效位中具有1。尾数中有23位表示浮点值2^-23=1.19E-7。得出1.19E-7*1.18E-38=1.40E-45的最小可能值。Single。Epsilon 的值

你永远不想接近非标准化,它们会很快丢失有效数字。它们确实只会以零问题为代价来避免分裂。

这是由于IEEE 754标准定义了两者的编码(float&double)。当你了解它的工作原理时,没有什么奇怪的。

阅读这篇文章可能就足以理解它

对于32位编码的单精度(浮点),请读取:http://en.wikipedia.org/wiki/Single_precision

对于在64位上编码的双精度(双精度),请读取:http://en.wikipedia.org/wiki/Double_precision

读数良好

我想你一定找错地方了。我正在查看的文件表明,它们是对称的,正如预期的

http://msdn.microsoft.com/en-us/library/system.double.minvalue.aspx

毛发加倍这是从正到负。。。

1.7976931348623157E+308。