检查两个双打是否有相同符号的快速方法?

use*_*020 1 c# algorithm performance

有没有快速检查两个双打是否有相同符号的方法?假设两个双打不能为0.

Kit*_*sil 8

潜在解决方案

  1. a*b > 0:一个浮点乘法和一个比较.
  2. (a>0) == (b>0):三个比较.
  3. Math.Sign(a) == Math.Sign(b):两个函数调用和一个比较.

速度比较:

这是关于你期望的(见底部的实验设置):

  1. a*b > 0:0.42±0.02s
  2. (a>0) == (b>0):0.49±0.01s
  3. Math.Sign(a) == Math.Sign(b):1.11±0.9s

重要笔记:

正如评论中的greybeard所指出的,如果值乘以小于的值,方法1很容易出现问题Double.Epsilon.除非你能保证倍数总是大于这个,否则你应该选择方法2.


实验装置:

以下代码在http://rextester.com/上运行了16次.

public static void Main(string[] args)
{
    double a = 1e-273;
    double b = a;
    bool equiv = false;
    for(int i=0; i<100000000; ++i) {
        equiv = THE_COMPARISON;
        b += a;
    }
    //Your code goes here
    Console.WriteLine(equiv);
}
Run Code Online (Sandbox Code Playgroud)

  • @ cricket_007双打?它们溢出到`inf`. (3认同)
  • @greybeard是吗?`-inf`和`inf`比较正确,你不能在非零乘法上得到'NaN` ... (2认同)