C# 对于float和double,为什么负数和正数是不对称的?
阅读MSDN,浮点数范围从1E-45到1E38,双精度范围从1E-324到1E308,我想知道为什么负指数和正指数是不对称的?这是因为定义浮点数和双精度编码的标准。 当你了解它的工作原理时,没有什么奇怪的 阅读这篇文章可能足以理解它 对于32位编码的单精度浮点,读取: 对于64位双精度双编码,读取: 良好的读数这是由于定义了浮点和双精度编码的标准。 当你了解它的工作原理时,没有什么奇怪的 阅读这篇文章可能足以理解它 对于32位编码的单精度浮点,读取: 对于64位双精度双编码,读取:C# 对于float和double,为什么负数和正数是不对称的?,c#,.net,C#,.net,阅读MSDN,浮点数范围从1E-45到1E38,双精度范围从1E-324到1E308,我想知道为什么负指数和正指数是不对称的?这是因为定义浮点数和双精度编码的标准。 当你了解它的工作原理时,没有什么奇怪的 阅读这篇文章可能足以理解它 对于32位编码的单精度浮点,读取: 对于64位双精度双编码,读取: 良好的读数这是由于定义了浮点和双精度编码的标准。 当你了解它的工作原理时,没有什么奇怪的 阅读这篇文章可能足以理解它 对于32位编码的单精度浮点,读取: 对于64位双精度双编码,读取: 读得好我想你
读得好我想你一定找错地方了。我正在查看的文档表明,它们与预期一样对称 毛发加倍这是从正到负
1.7976931348623157E+308。我想你一定找错地方了。我正在查看的文档表明,它们与预期一样对称 毛发加倍这是从正到负
1.7976931348623157E+308。它们不是正数和负数-它们是正数和负数指数。这种差异基本上是由于标准化的工作方式。由于指数和偏差,您最终能够存储较小的数字
归根结底,你基本上不需要担心这个问题,但你需要明白正数和负数的范围是相同的,只是有一点符号。它们不是正数和负数,而是正数和负数的指数。这种差异基本上是由于标准化的工作方式。由于指数和偏差,您最终能够存储较小的数字
归根结底,你基本上不需要担心这个问题,但你需要明白,正数和负数的范围是相同的,只是有一个符号位。你的困惑源于认为1E-45是一个负数。它不是-它实际上是一个非常小的正数:1 x 10^-45,或者更确切地说,0.000…0001-在0之间有44个0。和1 这表示一个float可以存储或类似的最小精度单位——如果您需要知道,其他人链接到的文章将详细解释
另一个数字1E38表示可存储在此数据类型中的最大数字。这是1 x 10^38,或者更确切地说是10000…0000,即1后面有38 0。您的困惑源于认为1E-45是一个负数。它不是-它实际上是一个非常小的正数:1 x 10^-45,或者更确切地说,0.000…0001-在0之间有44个0。和1 这表示一个float可以存储或类似的最小精度单位——如果您需要知道,其他人链接到的文章将详细解释
另一个数字1E38表示可存储在此数据类型中的最大数字。这是1 x 10^38,或者更确切地说是10000…0000,即1后面有38 0。由于0的存在,2的补码编码的所有数值范围在设计上是不平衡的。您可以在.NET framework中看到这一点,比如int.MaxValue=2147483647,int.MinValue=-2147483648。这就是Math.Absint.MinValue引发异常的原因 浮点数的指数用偏移量编码。对于浮点,它是偏移量为127的8位,提供范围为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。对于2^-23=1.19E-7的浮点,尾数中有23位。产生1.19E-7*1.18E-38=1.40E-45的最小可能值。Single.Epsilon的值
你永远不会真正想要接近非规范值,它们会很快丢失有效数字。它们实际上只会帮助避免被零除的问题,而且代价高昂。由于0的存在,2的补码编码的所有数值范围在设计上都是不平衡的。您可以在.NET framework中看到这一点,比如int.MaxValue=2147483647,int.MinValue=-2147483648。这就是Math.Absint.MinValue抛出exc的原因 感同身受 浮点数的指数用偏移量编码。对于浮点,它是偏移量为127的8位,提供范围为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。对于2^-23=1.19E-7的浮点,尾数中有23位。产生1.19E-7*1.18E-38=1.40E-45的最小可能值。Single.Epsilon的值
你永远不会真正想要接近非规范值,它们会很快丢失有效数字。它们真的只会帮助避免零除问题,而且要付出代价。我想他指的是:我想他指的是:任何关心浮点精度的人都应该非常担心非规范化。他们早餐吃的是重要的数字。@HansPassant:True-但是在你没有意识到数值是正的和负的,指数是正的和负的阶段,在担心之前,值得等待一段时间:任何关心浮点精度的人都应该非常担心非规范化。他们早餐吃的是重要的数字。@HansPassant:True-但是在你没有意识到数值是正的和负的,指数是正的和负的阶段,在担忧之前,值得等待一段时间:现在Hans Passant将问题编辑为指+ve和-ve指数,而不是+ve和-ve数字,他的答案是正确和完整的解释。现在Hans Passant将问题编辑为指+ve和-ve指数,而不是+ve和-ve数字,他的回答是正确和完整的解释。