From dedfe73be77d4779a131a01a41425ef7738ec909 Mon Sep 17 00:00:00 2001 From: Laimonas Simutis Date: Sat, 18 Apr 2015 20:46:04 -0400 Subject: [PATCH 1/2] detect NaN and return appropriate value --- src/Lucene.Net.Core/Support/Number.cs | 15 +++++++++++++++ src/Lucene.Net.Core/Util/NumericUtils.cs | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Lucene.Net.Core/Support/Number.cs b/src/Lucene.Net.Core/Support/Number.cs index 7b689d9f21..4d19e363a3 100644 --- a/src/Lucene.Net.Core/Support/Number.cs +++ b/src/Lucene.Net.Core/Support/Number.cs @@ -424,6 +424,11 @@ public static int FloatToRawIntBits(float value) public static int FloatToIntBits(float value) { + if (float.IsNaN(value)) + { + return 0x7fc00000; + } + // TODO it is claimed that this could be faster return BitConverter.ToInt32(BitConverter.GetBytes(value), 0); } @@ -438,6 +443,16 @@ public static long DoubleToRawLongBits(double value) return BitConverter.DoubleToInt64Bits(value); } + public static long DoubleToLongBits(double value) + { + if (double.IsNaN(value)) + { + return 0x7ff8000000000000L; + } + + return BitConverter.DoubleToInt64Bits(value); + } + //Flips the endianness from Little-Endian to Big-Endian //2 bytes diff --git a/src/Lucene.Net.Core/Util/NumericUtils.cs b/src/Lucene.Net.Core/Util/NumericUtils.cs index a80635839d..f92c1cb083 100644 --- a/src/Lucene.Net.Core/Util/NumericUtils.cs +++ b/src/Lucene.Net.Core/Util/NumericUtils.cs @@ -278,7 +278,7 @@ public static int PrefixCodedToInt(BytesRef val) /// public static long DoubleToSortableLong(double val) { - long f = BitConverter.DoubleToInt64Bits(val); + long f = Number.DoubleToLongBits(val); if (f < 0) { f ^= 0x7fffffffffffffffL; From c7b14909fb0e8ff15f15db82359ffe2dfc8e5342 Mon Sep 17 00:00:00 2001 From: Laimonas Simutis Date: Sat, 18 Apr 2015 21:16:28 -0400 Subject: [PATCH 2/2] match expected order in Lucene --- src/Lucene.Net.Tests/core/Util/TestNumericUtils.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Lucene.Net.Tests/core/Util/TestNumericUtils.cs b/src/Lucene.Net.Tests/core/Util/TestNumericUtils.cs index fc3c28ad5d..b90c4b0122 100644 --- a/src/Lucene.Net.Tests/core/Util/TestNumericUtils.cs +++ b/src/Lucene.Net.Tests/core/Util/TestNumericUtils.cs @@ -165,7 +165,7 @@ public virtual void TestIntSpecialValues() [Test] public virtual void TestDoubles() { - double[] vals = new double[] { double.NaN, double.NegativeInfinity, -2.3E25, -1.0E15, -1.0, -1.0E-1, -1.0E-2, -0.0, +0.0, 1.0E-2, 1.0E-1, 1.0, 1.0E15, 2.3E25, double.PositiveInfinity }; + double[] vals = new double[] { double.NegativeInfinity, -2.3E25, -1.0E15, -1.0, -1.0E-1, -1.0E-2, -0.0, +0.0, 1.0E-2, 1.0E-1, 1.0, 1.0E15, 2.3E25, double.PositiveInfinity, double.NaN }; long[] longVals = new long[vals.Length]; // check forward and back conversion @@ -199,7 +199,7 @@ public virtual void TestSortableDoubleNaN() [Test] public virtual void TestFloats() { - float[] vals = new float[] { float.NaN, float.NegativeInfinity, -2.3E25f, -1.0E15f, -1.0f, -1.0E-1f, -1.0E-2f, -0.0f, +0.0f, 1.0E-2f, 1.0E-1f, 1.0f, 1.0E15f, 2.3E25f, float.PositiveInfinity }; + float[] vals = new float[] { float.NegativeInfinity, -2.3E25f, -1.0E15f, -1.0f, -1.0E-1f, -1.0E-2f, -0.0f, +0.0f, 1.0E-2f, 1.0E-1f, 1.0f, 1.0E15f, 2.3E25f, float.PositiveInfinity, float.NaN }; int[] intVals = new int[vals.Length]; // check forward and back conversion