.NET实现:Math.Min中的双重转换(float,float)

stf*_*tfx 4 .net math double reflector type-conversion

为什么.Net实现了Math.Min(float,float)函数,如下所示:

public static float Min(float val1, float val2)
{
  if ((double) val1 < (double) val2 || float.IsNaN(val1))
    return val1;
  else
    return val2;
}
Run Code Online (Sandbox Code Playgroud)

虽然我可以看到使用IsNaN我不明白为什么他们在比较值时会转换为double.这不比简单写作慢val < val 2吗?特别是如果我想用它来将数字钳位到数字而没有像0f或那样精确1f.

我是否应该继续实施一个自定义数学库,另外还需要具有非NaN值以获得最佳性能,还是浪费时间?

public static float Min(float a, float b)
{
    return a < b ? a : b;
}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 5

是的,我使用的是Resharper

这就是问题所在,它会对代码进行摸索.源代码可以从Reference Source获得,它看起来像这样:

  [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  public static float Min(float val1, float val2) {
    if (val1 < val2)
        return val1;

    if (Single.IsNaN(val1))
        return val1;

    return val2;
  }
Run Code Online (Sandbox Code Playgroud)

很难猜到为什么Resharper这样做,我很容易认为它只是一个bug.支持Microsoft提供的源代码,不仅仅是为了准确,但评论也很好.