为什么计算两个变量乘积的符号要用绝对值



Brent根查找函数的Netlib库模块检查两个变量的符号是否不同,如下所示:

if (fa * (fb/dabs(fb)) .le. 0.0d0) go to 20
...

为什么这个检查包含/dabs(fb)而不是简单的(fa*fb) .le. 0.0d0?我用Python做了一个快速检查,发现x和y的值似乎很大(+/-1e200(,其中x*y=+/-inf,比较x*y<=0仍然正常工作。

Fortran从未指定过像signs_differ(x,y)这样的函数,因此通常会亲自实现这样的功能。

CCD_ 4(和CCD_;x和y的符号不同吗&";。虽然x和y的乘积为正意味着x和y在(数学(实数中是相同的符号,但对于(计算(浮点数来说,这不是真的。

浮点乘法x*y可能溢出,导致有符号的无限值(引发IEEE标志(,比较返回预期的逻辑值,但这并不总是正确的。有许多非IEEE系统,IEEE系统可能会看到该标志被升起并中止(或有一些昂贵的处理转移(。这与";x和y有相同的符号吗&";。

x*(y/dabs(y))不溢出;便携式;并且可能比CCD_ 8便宜——忽略了围绕CCD_ 9和有符号零的问题。

现代Fortran有signieee_copy_signieee_signbit等40年前还不存在的函数。

最新更新