C# 有没有快速的方法来检查两个双打的符号是否相同?
有没有快速的方法来检查两个双打的符号是否相同?假设两个双精度不能为0。潜在解决方案:C# 有没有快速的方法来检查两个双打的符号是否相同?,c#,algorithm,performance,C#,Algorithm,Performance,有没有快速的方法来检查两个双打的符号是否相同?假设两个双精度不能为0。潜在解决方案: 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.01s 数学符号(a)=数学符号(b):1.11±0.9秒 重要注意事项: 如注释中所述,如果值乘以小于Double.Epsilon,方法
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.01sDouble.Epsilon
,方法1容易出现问题。除非您可以保证倍数始终大于此值,否则您可能应该使用方法2
实验设置: 以下代码在上运行了16次
publicstaticvoidmain(字符串[]args)
{
双a=1e-273;
双b=a;
布尔当量=假;
对于(int i=0;i潜在解决方案:
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.01s
数学符号(a)=数学符号(b)
:1.11±0.9秒
重要注意事项:
如注释中所述,如果值乘以小于Double.Epsilon
,方法1容易出现问题。除非您能保证倍数始终大于此值,否则您可能应该使用方法2
实验设置: 以下代码在上运行了16次
publicstaticvoidmain(字符串[]args)
{
双a=1e-273;
双b=a;
布尔当量=假;
对于(int i=0;i您可以使用:
if (copysign(x, y) == x)
您可以使用:
if (copysign(x, y) == x)
据我所知,最简单、最快的方法就是在两个数字的MSB位上使用XOR
以下是+/-
数字组合的结果:
a b result
- - 1
- + 0
+ - 0
+ + 1
想法很简单。符号存储在最高位(MSB)中,XOR
为非相等位返回1
,因此XOR
将展位号的MSB放在一起,并对输出求反。[7]
只是将双精度中最高的字节作为8位整数类型进行访问,因此我可以使用CPU ALU而不是FPU。如果您的平台的字节顺序相反,则使用[0]
而不是(MSByte优先与LSByte优先)
因此,您只需要3个8位的异或进行比较和求反,1个8位的异或仅用于提取符号位结果
您可以使用并集而不是指针,也可以为您的平台使用本机位宽度以获得最佳性能。据我所知,最简单、最快的方法就是在MSB两个数字的位上使用XOR
。下面是一个小型C示例(注意内联以避免函数开销):
以下是+/-
数字组合的结果:
a b result
- - 1
- + 0
+ - 0
+ + 1
想法很简单。符号存储在最高位(MSB)中,XOR
为非相等位返回1
,因此XOR
将展位号的MSB放在一起,并对输出求反。[7]
只是将双精度中最高的字节作为8位整数类型进行访问,因此我可以使用CPU ALU而不是FPU。如果您的平台的字节顺序相反,则使用[0]
而不是(MSByte优先与LSByte优先)
因此,您只需要3个8位的异或进行比较和求反,1个8位的异或仅用于提取符号位结果
您可以使用联合而不是指针,也可以使用本机位宽度来为您的平台获得最佳性能。使用哪种语言?您有多关心可移植性?我更喜欢c语言OK。我认为这排除了直接访问符号位的可能性。在c中,如果您的手脏了,并且依赖于fp实现的细节,您可以进行非常便宜的位比较。在哪种语言中,double可以是-0?还是NaN?你有多关心可移植性?我更喜欢c语言好的。我认为这排除了直接访问符号位的可能性。在c语言中,如果你的手脏了,并且依赖于fp实现的细节,你可以进行非常便宜的位比较。你可以这样做吗双精度中的-0?或NaN?如果两个正数溢出回一个负数呢?@cricket_007 Double?它们溢出到inf
。有NaN/例外的风险。@greybeard做了吗?-inf
和inf
比较正确,在非零乘法中无法得到NaN
,那么+/-2^-123呢?两个po呢溢出回负数的sitives?@cricket\u 007加倍?它们溢出到inf
。冒着NaN/异常的风险。@greybeard会这样做吗?-inf
和inf
比较正确,在非零乘法中你无法得到NaN
。@kittsil:在C99中。你能让它工作吗?我不能,但如果可以的话你可以包括工作C#
code,那么它肯定是t