/// <summary> /// Test if two float are equal by testing that the /// pattern of bits returned by /// BitConverter.ToInt32(BitConverter.GetBytes(float), 0) are equal /// (BitConverter does not have SingleToInt32Bits() so we use this /// 2-call workaround <see href="http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=426391"/> /// to roll our own implementation). /// This handles NaNs, Infinties, and <code>-0.0. /// It is compatible with the hash code generated by /// HashCodeBuilder. /// </summary> /// <param name="lhs">the left hand float</param> /// <param name="rhs">the right hand float</param> /// <returns>EqualsBuilder - used to chain calls.</returns> public EqualsBuilder Append(float lhs, float rhs) { if (isEqual == false) { return(this); } // java: return append(Float.floatToIntBits(lhs), Float.floatToIntBits(rhs)); return(Append( BitConverterUtil.SingleToInt32Bits(lhs), BitConverterUtil.SingleToInt32Bits(rhs))); }
public void TestSingleToInt32Bits() { Assert.IsTrue(BitConverterUtil.SingleToInt32Bits(24.154f) == 1103182692); Assert.IsTrue(BitConverterUtil.SingleToInt32Bits(1.0f) == 1065353216); Assert.IsTrue(BitConverterUtil.SingleToInt32Bits(float.PositiveInfinity) == (int)0x7f800000U); // Use "unchecked" syntax to avoid compiler error: "Constant value '4286578688' cannot be // converted to a 'int' (use 'unchecked' syntax to override). The literal 0xff800000 // (4286578688)won't fit in a signed int without overflow. // C# statements can execute in either checked or unchecked context. In a checked context, // arithmetic overflow raises an exception. In an unchecked context, arithmetic overflow // is ignored and the result is truncated. unchecked { Assert.IsTrue(BitConverterUtil.SingleToInt32Bits(float.NegativeInfinity) == (int)0xff800000U); } }