Language agnostic 为什么在IEEE754标准中被零除会产生无穷大的值?
我只是好奇,为什么在Language agnostic 为什么在IEEE754标准中被零除会产生无穷大的值?,language-agnostic,floating-point,ieee-754,Language Agnostic,Floating Point,Ieee 754,我只是好奇,为什么在IEEE-754中,任何非零浮点数除以零都会产生无穷大的值?从数学角度看,这是胡说八道。所以我认为这个操作的正确结果是NaN 如果x是实数,当x=0时,函数f(x)=1/x未定义。例如,如果IEEE-754产生一个NaN值,则函数sqrt没有为任何负数定义,而sqrt(-1.0f)。但是1.0f/0是Inf 但由于某些原因,IEEE-754中的情况并非如此。这肯定是有原因的,可能是一些优化或兼容性的原因 那有什么意义呢?我不知道你为什么会认为这是胡说八道 a/b的简单定义,至
IEEE-754
中,任何非零浮点数除以零都会产生无穷大的值?从数学角度看,这是胡说八道。所以我认为这个操作的正确结果是NaN
如果x是实数,当x=0时,函数f(x)=1/x未定义。例如,如果IEEE-754
产生一个NaN
值,则函数sqrt没有为任何负数定义,而sqrt(-1.0f)。但是1.0f/0是Inf
但由于某些原因,IEEE-754中的情况并非如此。这肯定是有原因的,可能是一些优化或兼容性的原因
那有什么意义呢?我不知道你为什么会认为这是胡说八道
a/b
的简单定义,至少对于非零的b
,是在归零之前必须从a
中减去的b
的唯一数
将其扩展到b
可以为零的情况,必须从任何非零的数字中减去的数字实际上是无限的,因为你永远不会达到零
另一种看待它的方式是从限制的角度来谈。当正数n
接近零时,表达式1/n
接近“无穷大”。你会注意到我引用了这个词,因为我坚信不要传播无限实际上是一个具体数字的错觉:-)
NaN
保留用于数字不能用任何其他值(包括无穷大)表示(甚至近似)的情况,它被认为与所有其他值不同
例如,0/0
(使用我们上面简单的定义)可以从a
中减去任意数量的b
s以达到0。因此,结果是不确定的-它可以是1、7、42、3.14159或任何其他值
类似地,负数的平方根在IEEE754使用的实平面中没有值(必须转到复平面),无法表示
从数学角度看,这是胡说八道
对。不,有点
问题是:浮点数是近似值。您希望使用范围广泛的指数和数量有限的数字,并得到并非完全错误的结果。:)
IEEE-754背后的理念是,每一次操作都可能触发“陷阱”,指出可能出现的问题。是的
- 非法(无意义的操作,如负数的sqrt)
- 溢出(太大)
- 底流(太小)
- 除以零(你不喜欢的东西)
- 不精确(此操作可能会给您错误的结果,因为您正在失去精度)
- NaN用于非法值
- 溢出符号无穷大
- 底流的符号零
- 对于不确定结果(0/0)为NaN,对于(x/0 x!=0)为无穷大
- 不精确的正常操作结果
f(0)!=0
,则限制为x->0
为正或负无穷大,或者未定义。如果g(x)
在x==0
附近取两个符号,则限制未定义(左右限制不一致)。但是,如果g(x)
只有一个接近0的符号,则将定义极限,并且极限为正无穷大或负无穷大。稍后将对此进行详细介绍f(0)=0,那么极限可以是任何东西,包括正无穷大、负无穷大、有限数或未定义
NaN
是唯一可行的答案
现在在第一种情况下,为什么选择一个特定的符号时,要么是可能的,要么是未定义的?作为一个实际问题,在你确实知道分母符号的情况下,它给了你更多的灵活性,而在你不知道分母符号的情况下,它的成本相对较低。例如,您可能有一个公式,其中您在分析中知道g(x)>=0
对于所有x
,例如,g(x)=x*x
。在这种情况下,极限被定义为无穷大,其符号等于f(0)
。您可能希望在代码中利用这一点作为方便。在其他情况下,如果您对g
的符号一无所知,您通常无法利用它,但这里的成本只是,如果您想完全检查代码,除了NaN
之外,您还需要捕获一些额外的情况-正无穷大和负无穷大。这是有一定代价的,但与其他情况下获得的灵活性相比,这并不算大
当问题是关于“简单划分”时,为什么还要担心一般函数?一个常见的原因是,如果你通过其他算术运算来计算分子和分母,你会积累舍入误差。这些错误的存在可以抽象为上面所示的通用公式格式。例如f(x)=x