Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有快速的方法来检查两个双打的符号是否相同?_C#_Algorithm_Performance - Fatal编程技术网

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

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,方法

有没有快速的方法来检查两个双打的符号是否相同?假设两个双精度不能为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
    ,方法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