我似乎看到人们一直在问这里有关比较浮点数的问题。规范的答案总是:只要看看数字是否在彼此之间的数量之内......
所以问题是:为什么你需要知道两个浮点数是否相等?
在我多年的编码工作中,我从未需要这样做(尽管我承认即使我也不是无所不知)。从我的角度来看,如果你试图使用浮点数并且由于某种原因想知道数字是否相等,你应该使用整数类型(或支持它的语言中的十进制类型)。我只是错过了一些东西吗?
答案 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用于三角函数)。