繁体   English   中英

为什么我会使用2的补码来比较两个双打而不是将它们的差异与epsilon值进行比较?

[英]Why would I use 2's complement to compare two doubles instead of comparing their differences against an epsilon value?

这里这里引用...为什么我会使用两个补码而不是epsilon方法? 对于大多数情况来说,似乎epsilon方法足够好。


更新:我纯粹在寻找理论上的理由,为什么你要使用一个而不是另一个。 我一直使用epsilon方法。

有没有人成功使用2的补码比较? 为什么? 为什么不?

您引用的第二个链接提到了一篇对该问题有相当长描述的文章:

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。”

我要说的是,有些应用程序我们不知道绝对意义上的平等意味着什么,因此我们不得不求助于相对比较,即整数版本试图做的事情。

位方法可能更快。 我说可能因为在现代(多核,高流水线)处理器上,通常不可能猜出什么是真正的更快。 编码最简单,最明显正确的实现,然后测量,然后进行光学测量。

谈到速度,请遵循以下规则:

  1. 如果您不是一位经验丰富的开发人员,请不要进行优化。
  2. 如果您是经验丰富的开发人员,请不要进行优化。

做最简单的方法。

亚历克斯

奥斯卡的权利。 除非你真的需要这种表现,否则不要搞砸。

而你没有。 如果你处于这样的情况,你就不需要问这个问题 - 你已经知道了。 如果你认为你这样做,那么你就不这样做。 你的表现问题在别处。 只需使用可读版本。

使用任何按位比较的方法将导致分数由近似表示时出现问题。 所有具有未以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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM