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有sign
、ieee_copy_sign
和ieee_signbit
等40年前还不存在的函数。