IEEE 754标准将负零的平方根定义为负零。这种选择很容易合理化,但其他选择,例如将sqrt(-0.0)
定义为NaN
,也可以合理化,并且更容易在硬件中实现。如果担心程序员会写if (x >= 0.0) then sqrt(x) else 0.0
而被NaN
x
-0.0
评估为sqrt(-0.0)
的表达式所困,那么+0.0
可能被定义为sqrt(-0.0)
-0.0
(实际上,对于这个特定的表达式,结果会更加一致)。
特别是有一个数值算法,其中{{1}}定义为{{1}}简化了算法本身的逻辑吗?
答案 0 :(得分:2)
1985年官方浮点标准(IEEE std.754-1985)中将sqrt(-0.0)= -0.0定义为
。同一标准的2008年修订版增加了pow函数的定义。根据此定义,仅当y为奇数整数时pow(x,y)才能具有负号。因此,pow(-0.0,3.0)= -0.0。而pow(-0.0,0.5)= +0.0。在2008年,更改sqrt(-0.0)的定义为时已晚,因此不幸的是,这两个函数给出的结果不同。
零的符号通常无关紧要,因为零和负零相等。但是,除以它很重要。因此1 / sqrt(-0.0)给出-INF,而pow(-0.0,-0.5)给出+ INF。
1985年的决定可能只是对现状的观察。 1980年以来的英特尔数学协处理器8087在硬件中实现了sqrt,并且给出了sqrt(-0.0)= -0.0。今天,所有PC处理器都已在硬件中实现了sqrt,因此更改标准将非常困难。问题不是那么重要,值得制作两个不同的sqrt函数,这些函数仅对负零值有所不同。我对1980年以前的历史一无所知。如果有人可以追溯更远的历史,请在此处发表评论。
答案 1 :(得分:0)
唯一的数学上合理的结果是0.有一个合理的问题是它应该是+0还是-0。对于大多数计算,它根本没有任何区别,但是有一些特定的复杂表达式,在-0约定下结果更有意义。确切的细节超出了本网站的范围,但这是它的要点。
如果我不休假,我可以解释一下,如果别人不打扰我的话。