[英]Why would I use 2's complement to compare two doubles instead of comparing their differences against an epsilon value?
您引用的第二个链接提到了一篇对该问题有相当长描述的文章:
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
但除非你调整性能,否则我会坚持使用epsilon,以便人们可以调试你的代码
简而言之,当比较具有未知来源的两个浮点数时,选择一个有效的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的幂(1 / 2,1 / 4,1 / 8,1 / 65536和c)命名的分数的浮点数都是近似的。 所以,当然,都是非理性的数字。
float third = 1/3; 浮动二= 2.0; float another_two = third * 6.0; if(two!= another_two)print(“Approximation!\\ n”);
唯一比较按位的方法就是当你以完全相同的方式得出浮点数时,或者它们是精确的表示(整数,分数幂为2)。 即使这样,也可能存在多个数字的表示,尽管我从未在工作系统中看到过这种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.