潜在解决方案
a*b > 0:一个浮点乘法和一个比较.(a>0) == (b>0):三个比较.Math.Sign(a) == Math.Sign(b):两个函数调用和一个比较.速度比较:
这是关于你期望的(见底部的实验设置):
a*b > 0:0.42±0.02s(a>0) == (b>0):0.49±0.01sMath.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)