何时比较浮点值是否有用是否有用?

时间:2018-04-02 18:43:03

标签: algorithm types floating-point integer

我似乎看到人们一直在问这里有关比较浮点数的问题。规范的答案总是:只要看看数字是否在彼此之间的数量之内......

所以问题是:为什么你需要知道两个浮点数是否相等?

在我多年的编码工作中,我从未需要这样做(尽管我承认即使也不是无所不知)。从我的角度来看,如果你试图使用浮点数并且由于某种原因想知道数字是否相等,你应该使用整数类型(或支持它的语言中的十进制类型)。我只是错过了一些东西吗?

2 个答案:

答案 0 :(得分:1)

我需要的唯一时间是检查GPU是否符合IEEE 754标准。 事实并非如此。

无论如何,我还没有使用过与编程语言的比较。我只是在CPU和GPU上运行程序,产生一些二进制输出(没有文字),并将输出与简单的差异进行比较。

答案 1 :(得分:1)

有很多可能的原因。

由于我更了解Squeak / Pharo Smalltalk,这里有一些简单的例子(它依赖于严格的IEEE 754模型):

Float>>isFinite
    "simple, byte-order independent test for rejecting Not-a-Number and (Negative)Infinity"

    ^(self - self) = 0.0

Float>>isInfinite
    "Return true if the receiver is positive or negative infinity."

    ^ self = Infinity or: [self = NegativeInfinity]

Float>>predecessor
    | ulp |
    self isFinite ifFalse: [
        (self isNaN or: [self negative]) ifTrue: [^self].
        ^Float fmax].
    ulp := self ulp.
    ^self - (0.5 * ulp) = self
        ifTrue: [self - ulp]
        ifFalse: [self - (0.5 * ulp)]

我确信你会发现一些更多参与==如果你打开一些libm实现并检查......不幸的是,我不知道如何搜索==通过github web界面,但手动我在julia libm(fdlibm的一个变种)中找到了这个例子 https://github.com/JuliaLang/openlibm/blob/master/src/s_remquo.c

remquo(double x, double y, int *quo)
{
...
fixup:
    INSERT_WORDS(x,hx,lx);
    y = fabs(y);
    if (y < 0x1p-1021) {
        if (x+x>y || (x+x==y && (q & 1))) {
        q++;
        x-=y;
        }
    } else if (x>0.5*y || (x==0.5*y && (q & 1))) {
        q++;
        x-=y;
    }
    GET_HIGH_WORD(hx,x);
    SET_HIGH_WORD(x,hx^sx);
    q &= 0x7fffffff;
    *quo = (sxy ? -q : q);
    return x;

这里,余数函数在-y / 2和y / 2之间回答结果x。如果它恰好是y / 2,那么有两个选择(一个平局)......修正中的==测试是为了测试精确平局的情况(解决以便总是有一个甚至商数。

还有一些==zero测试,例如__ieee754_logf(测试琐碎案例日志(1))或__ieee754_rem_pio2(模数pi / 2用于三角函数)。