引用here和here ...为什么我会使用两个补码而不是epsilon方法?对于大多数情况来说,似乎epsilon方法已经足够好了。
更新:我纯粹在寻找理论上的理由,为什么你要使用其中一个。我一直使用epsilon方法。
有没有人成功使用2的补码比较?为什么?为什么不呢?
答案 0 :(得分:3)
您引用的第二个链接提到了一篇对该问题有相当长描述的文章:
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
但除非你调整性能,否则我会坚持使用epsilon,以便人们可以调试你的代码
答案 1 :(得分:2)
简而言之,在比较两个原始未知的浮点数时,选择一个有效的epsilon几乎是不可能的。
例如:
在比较亚特兰大GA,达拉斯德克萨斯州和俄亥俄州的一些地方之间的英里距离时,有什么好的epsilon?
在比较我的左脚,右脚和桌子下面的电脑之间的距离时,有什么好的epsilon?
修改强>
好的,我让很多人不理解为什么你不知道你的epsilon是什么。
回到过去的传说,我写了两个与NeverWinter Nights(BioWare制作的游戏)合作的程序。其中一个程序采用二进制模型并将其转换为ASCII。另一个程序采用ASCII模型并将其编译为二进制。我写的其中一个测试是采用所有BioWare的二进制模型,将它们反编译为ASCII,然后再反转为二进制模型。然后我将我的二进制版本与BioWare的原始版本进行了比较。比较期间的一个问题是处理浮点值的一些轻微差异。因此,我没有为每种类型的浮点数(顶点,法线等)提出一堆不同的EPSILONS,而是希望使用诸如此两个补码比较之类的东西。从而避免了整个多重EPSILON问题。
同一类型的问题可以应用于处理第三方数据的任何类型的软件,然后需要使用原始数据验证其结果。在这些情况下,您可能甚至不知道浮点值代表什么,您只需要比较它们。我们的工业自动化软件遇到了这个问题。
修改强>
大声笑,这是由不同的人投票决定的。我将问题归结为此,给定两个任意浮点数,你如何决定使用什么epsilon?你不能。
如何将1e23和1.0001e23与epsilon进行比较,仍然使用相同的epsilon比较1e-23和5.2e-23?当然,你可以做一些动态的epsilon技巧,但这是整数比较的整点(不要求整数是精确的)。
整数比较能够比较使用epsilon的两个浮点数相对于数字的大小。
修改强>
史蒂夫,让我们看看你在评论中所说的内容:“但你知道平等对你意味着什么......因此,你应该能够找到一个合适的epsilon”。
转过这句话说:
“如果您知道平等对您意味着什么,那么您应该能够找到合适的epsilon。”
我想说的是,有些应用程序我们不知道绝对意义上的平等意味着什么,因此我们不得不求助于相对比较,即整数版本试图做。
答案 2 :(得分:2)
bits方法可能更快。我说可能因为在现代(多核,高流水线)处理器上,通常不可能猜出什么是真正的更快。 编码最简单,最明显正确的实现,然后测量,然后进行光学处理。
答案 3 :(得分:0)
说到速度,请遵循以下规则:
做最简单的方法。
亚历
答案 4 :(得分:0)
奥斯卡的权利。除非你真的需要这种表现,否则不要搞砸。
而你没有。如果你处于这样的情况,你就不需要问这个问题 - 你已经知道了。如果你认为你这样做,那么你就不这样做。你的表现问题在别处。只需使用可读的版本。
答案 5 :(得分:0)
使用任何按位比较的方法会在分数由近似值表示时导致问题。所有具有未以2的幂(1/2,1 / 4,1 / 8,1 / 65536和& c)命名的分数的浮点数是近似的。所以,当然,都是非理性的数字。
浮动第三= 1/3; 浮动二= 2.0; float another_two = third * 6.0; if(two!= another_two) print(“近似!\ n”);
唯一比较按位的方法是当你以完全相同的方式得出浮点数时,或者它们是精确的表示(整数,分数幂为2)。即使这样,也可能有多个数字的表示,尽管我从未在工作系统中看到过这种情况。