在比较之前将浮点值转换为按位整数有什么好处?

benefit to convert float values to bitwise integer before comparing?

提问人:Z Z 提问时间:10/14/2023 更新时间:10/14/2023 访问量:51

问:

当我们在 c# 中比较从 proto 文件生成的同一类的两个对象时,我们可以使用 since grpc protobuf 覆盖来比较每个字段。Equals()Equals()

但是,对于浮点型和双精度型字段, 有这样的 ProtobufEqualityComparers:

  /// <summary>
  /// Provides a central place to implement equality comparisons, primarily for bitwise float/double equality.
  /// </summary>
  public static class ProtobufEqualityComparers
  {
    /// <summary>
    /// Returns an equality comparer for <typeparamref name="T" /> suitable for Protobuf equality comparisons.
    /// This is usually just the default equality comparer for the type, but floating point numbers are compared
    /// bitwise.
    /// </summary>
    /// <typeparam name="T">The type of equality comparer to return.</typeparam>
    /// <returns>The equality comparer.</returns>
    public static EqualityComparer<T> GetEqualityComparer<T>()
    {
      if (typeof (T) == typeof (double))
        return (EqualityComparer<T>) ProtobufEqualityComparers.BitwiseDoubleEqualityComparer;
      if (typeof (T) == typeof (float))
        return (EqualityComparer<T>) ProtobufEqualityComparers.BitwiseSingleEqualityComparer;
      if (typeof (T) == typeof (double?))
        return (EqualityComparer<T>) ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer;
      return !(typeof (T) == typeof (float?)) ? EqualityComparer<T>.Default : (EqualityComparer<T>) ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer;
    }

具体而言,有一个用于双精度值的 BitwiseDoubleEqualityComparer,以及用于浮点值的 BitwiseSingleEqualityComparer。

我们为什么需要它们?

我相信 BitwiseDoubleEqualityComparer 和 BitwiseSingleEqualityComparer 在比较浮点数时无法解决精度问题。

C 浮点 gRPC-C#

评论

2赞 Ben Voigt 10/14/2023
这与精度问题无关,浮点在非有限值上的工作方式不同。(也是负零)
0赞 alias 10/14/2023
查看 stackoverflow.com/a/46995665/936310
0赞 Eric Postpischil 10/14/2023
位比较不应用于浮点数的数值比较。在将浮点数作为对象进行管理时,例如将它们存储在哈希表或排序容器中时,它们非常有用。在这些情况下,您通常想要的不仅仅是相等比较;您可能希望位为整数(用于哈希)或希望进行有序比较。
0赞 Z Z 10/15/2023
那么,为什么谷歌的人会像这样实现原型比较器呢?对于 NaN,无穷大和正/负零?
0赞 Flydog57 10/16/2023
@ZZ:我怀疑这是因为 protobuf 的人没有比较浮点数和浮点相等的语义,只是实际上这两件事是完全相同的相等性质。如果一个数据包包含负零数,而另一个数据包包含正零数(并且其他所有内容相同),则这两个数据包是不同的,即使它们在语义上表示相同的事物

答: 暂无答案