Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于float和double,为什么负数和正数是不对称的?_C#_.net - Fatal编程技术网

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

C# 对于float和double,为什么负数和正数是不对称的?,c#,.net,C#,.net,阅读MSDN,浮点数范围从1E-45到1E38,双精度范围从1E-324到1E308,我想知道为什么负指数和正指数是不对称的?这是因为定义浮点数和双精度编码的标准。 当你了解它的工作原理时,没有什么奇怪的 阅读这篇文章可能足以理解它 对于32位编码的单精度浮点,读取: 对于64位双精度双编码,读取: 良好的读数这是由于定义了浮点和双精度编码的标准。 当你了解它的工作原理时,没有什么奇怪的 阅读这篇文章可能足以理解它 对于32位编码的单精度浮点,读取: 对于64位双精度双编码,读取: 读得好我想你

阅读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数字,他的回答是正确和完整的解释。