读取MSDN,浮点范围从1E-45到1E38,双倍范围从1E-324到1E308,我想知道为什么它对于负指针和正指数是不对称的?
答案 0 :(得分:6)
你的困惑源于认为“1E-45”是一个负数。它不是 - 它实际上是一个非常小的正数:1 x 10 ^ -45或更确切地说,0.000 ... 0001 - 在“0”之间有44“0”。和“1”
这表示浮动可以存储的最小精度单位(或类似的 - 其他人链接到的文章将详细解释,如果您需要知道)。
另一个数字“1E38”表示可以存储在此数据类型中的最大数字。这是1 x 10 ^ 38或者更确切地说是10000 ... 0000,即1后有38 0秒。
答案 1 :(得分:1)
他们不是正面和负面的数字 - 他们是积极的和消极的指数。区别在于归一化的方式,基本上。由于denormal numbers和指数偏差,您最终能够存储“较小”的数字。
最终,你基本上不需要担心 - 但你做需要理解正数和负数的范围是相同的(只有一个符号位)。
答案 2 :(得分:1)
由于存在0,2的补码编码的所有数值范围都是不平衡的。您可以在.NET框架中看到这一点,例如int.MaxValue = 2,147,483,647,int.MinValue = -2,147,483,648。这就是Math.Abs(int.MinValue)抛出异常的原因。
浮点数的指数用偏移量编码。对于浮点数,它是8位,偏移量为127,提供2 ^ -126到2 ^ 127或1.18E-38到3.40E + 38(所有尾数位= 1)的范围。对于double,它是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的值
你从来没有真正想要接近非正规,他们匆忙失去了重要的数字。他们真的只是帮助以合理的价格避免被零除的问题。
答案 3 :(得分:0)
这是由于IEEE 754标准定义了两者的编码(float& double)。 当你理解它是如何工作的时候没什么奇怪的。
阅读文章可能足以理解它。
对于32位编码的单精度(浮点),请阅读:http://en.wikipedia.org/wiki/Single_precision
对于64位的双精度(双精度)编码,请阅读:http://en.wikipedia.org/wiki/Double_precision
良好的阅读
答案 4 :(得分:0)
我认为你一定是在寻找错误的地方。我正在查看的文档表明它们是按预期对称的
http://msdn.microsoft.com/en-us/library/system.double.minvalue.aspx
毛皮加倍,这是消极的......
1.7976931348623157E + 308。