代码改变世界

关于double==0判断的优化

2010-09-04 16:03  小尘 - 在希望的田野上  阅读(5220)  评论(0)    收藏  举报

 

double在内存中的存储方式如下:

IEEE 754 Double Floating Point Format.svg

在判断一个double值是否等于0的时候,计算机先要把这个double值转化为一个真正的值,而计算机对位运算时最快的,因此可以优化为如下代码:

public static bool IsNull(double f)
        {
            DoubleOrLong val = f;
            return val.IsZero;
        }

[StructLayout(LayoutKind.Explicit)]
        private struct DoubleOrLong
        {
            public static implicit operator DoubleOrLong(double f)
            {
                return new DoubleOrLong { D = f };
            }

            public bool IsZero
            {
                get { return U == 0u; }
            }

            [FieldOffset(0)]
            private double D;

            [FieldOffset(0)]
            private readonly ulong U;
        }