Author: eyala
Date: 2008-02-11 04:45:43 -0500 (Mon, 11 Feb 2008)
New Revision: 95428
Modified:
trunk/mcs/class/corlib/System/ChangeLog
trunk/mcs/class/corlib/System/NumberFormatter.cs
trunk/mcs/class/corlib/Test/System/ChangeLog
trunk/mcs/class/corlib/Test/System/NumberFormatterTest.cs
Log:
Fix NaN and +/-Infinity ToString("R")
Modified: trunk/mcs/class/corlib/System/ChangeLog
===================================================================
--- trunk/mcs/class/corlib/System/ChangeLog 2008-02-11 08:21:40 UTC (rev
95427)
+++ trunk/mcs/class/corlib/System/ChangeLog 2008-02-11 09:45:43 UTC (rev
95428)
@@ -1,3 +1,7 @@
+2008-02-11 Eyal Alaluf <[EMAIL PROTECTED]>
+
+ * NumberFormatter.cs: Fix ToString("R") for +-Infinity & NaN.
+
2008-02-08 Sebastien Pouliot <[EMAIL PROTECTED]>
* Random.cs: Explain (and extend) special case in Next(min,max)
Modified: trunk/mcs/class/corlib/System/NumberFormatter.cs
===================================================================
--- trunk/mcs/class/corlib/System/NumberFormatter.cs 2008-02-11 08:21:40 UTC
(rev 95427)
+++ trunk/mcs/class/corlib/System/NumberFormatter.cs 2008-02-11 09:45:43 UTC
(rev 95428)
@@ -54,6 +54,9 @@
const int DecimalDefPrecision = 100;
const int TenPowersListLength = 19;
+ const double MinRoundtripVal = -1.79769313486231E+308;
+ const double MaxRoundtripVal = 1.79769313486231E+308;
+
#if UNSAFE_TABLES
// The below arrays are taken from
mono/metatdata/number-formatter.h
@@ -1111,20 +1114,39 @@
public string FormatRoundtrip (double origval, NumberFormatInfo
nfi)
{
+ if (_NaN)
+ return nfi.NaNSymbol;
+
+ if (_infinity)
+ if (_positive)
+ return nfi.PositiveInfinitySymbol;
+ else
+ return nfi.NegativeInfinitySymbol;
+
NumberFormatter nfc = GetClone ();
- string shortRep = FormatGeneral (_defPrecision, nfi);
- // Check roundtrip only for "normal" double values.
- if (!_NaN && !_infinity && origval == Double.Parse
(shortRep, nfi))
- return shortRep;
+ if (origval >= MinRoundtripVal && origval <=
MaxRoundtripVal) {
+ string shortRep = FormatGeneral (_defPrecision,
nfi);
+ if (origval == Double.Parse (shortRep, nfi))
+ return shortRep;
+ }
return nfc.FormatGeneral (_defPrecision + 2, nfi);
}
public string FormatRoundtrip (float origval, NumberFormatInfo
nfi)
{
+ if (_NaN)
+ return nfi.NaNSymbol;
+
+ if (_infinity)
+ if (_positive)
+ return nfi.PositiveInfinitySymbol;
+ else
+ return nfi.NegativeInfinitySymbol;
+
NumberFormatter nfc = GetClone ();
string shortRep = FormatGeneral (_defPrecision, nfi);
// Check roundtrip only for "normal" double values.
- if (!_NaN && !_infinity && origval == Single.Parse
(shortRep, nfi))
+ if (origval == Single.Parse (shortRep, nfi))
return shortRep;
return nfc.FormatGeneral (_defPrecision + 2, nfi);
}
Modified: trunk/mcs/class/corlib/Test/System/ChangeLog
===================================================================
--- trunk/mcs/class/corlib/Test/System/ChangeLog 2008-02-11 08:21:40 UTC
(rev 95427)
+++ trunk/mcs/class/corlib/Test/System/ChangeLog 2008-02-11 09:45:43 UTC
(rev 95428)
@@ -1,3 +1,7 @@
+2008-02-11 Eyal Alaluf <[EMAIL PROTECTED]>
+
+ * NumberFormatterTest.cs: Test +-Infinity & NaN ToString ("R")
+
2008-02-02 Gert Driesen <[EMAIL PROTECTED]>
* CharCategoryTest.cs: Fixed line endings.
Modified: trunk/mcs/class/corlib/Test/System/NumberFormatterTest.cs
===================================================================
--- trunk/mcs/class/corlib/Test/System/NumberFormatterTest.cs 2008-02-11
08:21:40 UTC (rev 95427)
+++ trunk/mcs/class/corlib/Test/System/NumberFormatterTest.cs 2008-02-11
09:45:43 UTC (rev 95428)
@@ -2957,9 +2957,16 @@
AssertEquals ("#01", "Infinity",
Double.PositiveInfinity.ToString());
AssertEquals ("#02", "-Infinity",
Double.NegativeInfinity.ToString());
AssertEquals ("#03", "NaN", Double.NaN.ToString());
- AssertEquals ("#01", "Infinity",
Single.PositiveInfinity.ToString());
- AssertEquals ("#02", "-Infinity",
Single.NegativeInfinity.ToString());
- AssertEquals ("#03", "NaN", Single.NaN.ToString());
+ AssertEquals ("#04", "Infinity",
Single.PositiveInfinity.ToString());
+ AssertEquals ("#05", "-Infinity",
Single.NegativeInfinity.ToString());
+ AssertEquals ("#06", "NaN", Single.NaN.ToString());
+
+ AssertEquals ("#07", "Infinity",
Double.PositiveInfinity.ToString("R"));
+ AssertEquals ("#08", "-Infinity",
Double.NegativeInfinity.ToString("R"));
+ AssertEquals ("#09", "NaN", Double.NaN.ToString("R"));
+ AssertEquals ("#10", "Infinity",
Single.PositiveInfinity.ToString("R"));
+ AssertEquals ("#11", "-Infinity",
Single.NegativeInfinity.ToString("R"));
+ AssertEquals ("#12", "NaN", Single.NaN.ToString("R"));
}
[Test]
@@ -4262,9 +4269,9 @@
AssertEquals ("#03", "NaN", (0.0 / 0.0).ToString
("N99", _nfi));
}
- // Test16000 - Double and R
+ // TestRoundtrip for double and single
[Test]
- public void Test16000 ()
+ public void TestRoundtrip()
{
AssertEquals ("#01", "1.2345678901234567",
1.2345678901234567890.ToString ("R", _nfi));
AssertEquals ("#02", "1.2345678901234567",
1.2345678901234567890.ToString ("r", _nfi));
@@ -4272,6 +4279,11 @@
AssertEquals ("#04", "1.2345678901234567",
1.2345678901234567890.ToString ("r0", _nfi));
AssertEquals ("#05", "1.2345678901234567",
1.2345678901234567890.ToString ("R99", _nfi));
AssertEquals ("#06", "1.2345678901234567",
1.2345678901234567890.ToString ("r99", _nfi));
+ AssertEquals ("#07", "-1.7976931348623157E+308",
Double.MinValue.ToString ("R"));
+ AssertEquals ("#08", "1.7976931348623157E+308",
Double.MaxValue.ToString ("R"));
+ AssertEquals ("#09", "-1.7976931348623147E+308",
(-1.7976931348623147E+308).ToString("R"));
+ AssertEquals ("#10", "-3.40282347E+38",
Single.MinValue.ToString("R"));
+ AssertEquals ("#11", "3.40282347E+38",
Single.MaxValue.ToString("R"));
}
// Test17000 - Double and X
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches