Fix arithemtic overflow in Double.ToString exposed by Bug #383531.
authorEyal Alalouf <eyala@mainsoft.com>
Tue, 27 May 2008 12:18:26 +0000 (12:18 -0000)
committerEyal Alalouf <eyala@mainsoft.com>
Tue, 27 May 2008 12:18:26 +0000 (12:18 -0000)
svn path=/trunk/mcs/; revision=104129

mcs/class/corlib/System/ChangeLog
mcs/class/corlib/System/NumberFormatter.jvm.cs
mcs/class/corlib/Test/System/ChangeLog
mcs/class/corlib/Test/System/NumberFormatterTest.cs

index 356715524e242dd3246365b523a2df54162a7323..010b85af10b765aba5cbf436942051a5fe4f7594 100644 (file)
@@ -1,3 +1,8 @@
+2008-05-27  Eyal Alaluf <eyala@mainsoft.com>
+
+       * NumberFormatter.jvm.cs: Fix tables to avoid arithemtic overflow
+         in Double.ToString as exposed by Bug #383531.
+
 2008-05-24  Gert Driesen  <drieseng@users.sourceforge.net>
 
        * String.cs: Comment out 2.0 compatibility fix for SubString, since it
index 1e71ffe344fa50a5ba2465f6673240cdb0e1bf03..5078eebcfbaff10bc07a6be74704f6c0c32b4e04 100644 (file)
@@ -75,7 +75,7 @@ namespace System
                        0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99};\r
 \r
                static readonly ulong[] MantissaBitsTable = {\r
-                       4556951262222748432, 9113902524445496865, 18227805048890993730\r
+                       4556951262222748432, 9113902524445496865, 1822780504889099373, \r
                        3645561009778198746, 7291122019556397492, 14582244039112794984, \r
                        2916448807822558996, 5832897615645117993, 11665795231290235987, \r
                        2333159046258047197, 4666318092516094394, 9332636185032188789, \r
@@ -141,7 +141,7 @@ namespace System
                        3575555834521367442, 7151111669042734884, 14302223338085469768, \r
                        2860444667617093953, 5720889335234187907, 11441778670468375814, \r
                        2288355734093675162, 4576711468187350325, 9153422936374700651, \r
-                       18306845872749401303, 3661369174549880260, 7322738349099760521, \r
+                       1830684587274940130, 3661369174549880260, 7322738349099760521, \r
                        14645476698199521043, 2929095339639904208, 5858190679279808417, \r
                        11716381358559616834, 2343276271711923366, 4686552543423846733, \r
                        9373105086847693467, 1874621017369538693, 3749242034739077387, \r
@@ -172,7 +172,7 @@ namespace System
                        3541058984203561811, 7082117968407123623, 14164235936814247246, \r
                        2832847187362849449, 5665694374725698898, 11331388749451397797, \r
                        2266277749890279559, 4532555499780559119, 9065110999561118238, \r
-                       18130221999122236476, 3626044399824447295, 7252088799648894590, \r
+                       1813022199912223647, 3626044399824447295, 7252088799648894590, \r
                        14504177599297789180, 2900835519859557836, 5801671039719115672, \r
                        11603342079438231344, 2320668415887646268, 4641336831775292537, \r
                        9282673663550585075, 1856534732710117015, 3713069465420234030, \r
@@ -206,7 +206,7 @@ namespace System
                        17955302187076837701, 3591060437415367540, 7182120874830735080, \r
                        14364241749661470161, 2872848349932294032, 5745696699864588064, \r
                        11491393399729176129, 2298278679945835225, 4596557359891670451, \r
-                       9193114719783340903, 18386229439566681806, 3677245887913336361, \r
+                       9193114719783340903, 1838622943956668180, 3677245887913336361, \r
                        7354491775826672722, 14708983551653345445, 2941796710330669089, \r
                        5883593420661338178, 11767186841322676356, 2353437368264535271, \r
                        4706874736529070542, 9413749473058141084, 1882749894611628216, \r
@@ -237,7 +237,7 @@ namespace System
                        17782069995880619867, 3556413999176123973, 7112827998352247947, \r
                        14225655996704495894, 2845131199340899178, 5690262398681798357, \r
                        11380524797363596715, 2276104959472719343, 4552209918945438686, \r
-                       9104419837890877372, 18208839675781754744, 3641767935156350948, \r
+                       9104419837890877372, 1820883967578175474, 3641767935156350948, \r
                        7283535870312701897, 14567071740625403795, 2913414348125080759, \r
                        5826828696250161518, 11653657392500323036, 2330731478500064607, \r
                        4661462957000129214, 9322925914000258429, 1864585182800051685, \r
@@ -302,7 +302,7 @@ namespace System
                        8929588994392773298, 17859177988785546597, 3571835597757109319, \r
                        7143671195514218638, 14287342391028437277, 2857468478205687455, \r
                        5714936956411374911, 11429873912822749822, 2285974782564549964, \r
-                       4571949565129099928, 9143899130258199857, 18287798260516399715\r
+                       4571949565129099928, 9143899130258199857, 1828779826051639971, \r
                        3657559652103279943, 7315119304206559886, 14630238608413119772, \r
                        2926047721682623954, 5852095443365247908, 11704190886730495817, \r
                        2340838177346099163, 4681676354692198327, 9363352709384396654, \r
@@ -333,7 +333,7 @@ namespace System
                        8843436600416711296, 17686873200833422592, 3537374640166684518, \r
                        7074749280333369037, 14149498560666738074, 2829899712133347614, \r
                        5659799424266695229, 11319598848533390459, 2263919769706678091, \r
-                       4527839539413356183, 9055679078826712367, 18111358157653424735\r
+                       4527839539413356183, 9055679078826712367, 1811135815765342473, \r
                        3622271631530684947, 7244543263061369894, 14489086526122739788, \r
                        2897817305224547957, 5795634610449095915, 11591269220898191830, \r
                        2318253844179638366, 4636507688359276732, 9273015376718553464, \r
@@ -368,7 +368,7 @@ namespace System
                        3587324068671531701, 7174648137343063403, 14349296274686126806, \r
                        2869859254937225361, 5739718509874450722, 11479437019748901445, \r
                        2295887403949780289, 4591774807899560578, 9183549615799121156, \r
-                       18367099231598242312, 3673419846319648462, 7346839692639296924, \r
+                       1836709923159824231, 3673419846319648462, 7346839692639296924, \r
                        14693679385278593849, 2938735877055718769, 5877471754111437539, \r
                        11754943508222875079, 2350988701644575015, 4701977403289150031, \r
                        9403954806578300063, 1880790961315660012, 3761581922631320025, \r
@@ -399,7 +399,7 @@ namespace System
                        3552713678800500929, 7105427357601001858, 14210854715202003717, \r
                        2842170943040400743, 5684341886080801486, 11368683772161602973, \r
                        2273736754432320594, 4547473508864641189, 9094947017729282379, \r
-                       18189894035458564758, 3637978807091712951, 7275957614183425903, \r
+                       1818989403545856475, 3637978807091712951, 7275957614183425903, \r
                        14551915228366851806, 2910383045673370361, 5820766091346740722, \r
                        11641532182693481445, 2328306436538696289, 4656612873077392578, \r
                        9313225746154785156, 1862645149230957031, 3725290298461914062, \r
@@ -464,7 +464,7 @@ namespace System
                        17840596158824498513, 3568119231764899702, 7136238463529799405, \r
                        14272476927059598810, 2854495385411919762, 5708990770823839524, \r
                        11417981541647679048, 2283596308329535809, 4567192616659071619, \r
-                       9134385233318143238, 18268770466636286477, 3653754093327257295, \r
+                       9134385233318143238, 1826877046663628647, 3653754093327257295, \r
                        7307508186654514591, 14615016373309029182, 2923003274661805836, \r
                        5846006549323611672, 11692013098647223345, 2338402619729444669, \r
                        4676805239458889338, 9353610478917778676, 1870722095783555735, \r
@@ -529,7 +529,7 @@ namespace System
                        8958978968711216842, 17917957937422433684, 3583591587484486736, \r
                        7167183174968973473, 14334366349937946947, 2866873269987589389, \r
                        5733746539975178779, 11467493079950357558, 2293498615990071511, \r
-                       4586997231980143023, 9173994463960286046, 18347988927920572092\r
+                       4586997231980143023, 9173994463960286046, 1834798892792057209, \r
                        3669597785584114418, 7339195571168228837, 14678391142336457674, \r
                        2935678228467291534, 5871356456934583069, 11742712913869166139, \r
                        2348542582773833227, 4697085165547666455, 9394170331095332911, \r
@@ -560,7 +560,7 @@ namespace System
                        8872543021186607550, 17745086042373215101, 3549017208474643020, \r
                        7098034416949286040, 14196068833898572081, 2839213766779714416, \r
                        5678427533559428832, 11356855067118857664, 2271371013423771532, \r
-                       4542742026847543065, 9085484053695086131, 18170968107390172263\r
+                       4542742026847543065, 9085484053695086131, 1817096810739017226, \r
                        3634193621478034452, 7268387242956068905, 14536774485912137810, \r
                        2907354897182427562, 5814709794364855124, 11629419588729710248, \r
                        2325883917745942049, 4651767835491884099, 9303535670983768199, \r
@@ -595,7 +595,7 @@ namespace System
                        3599131035634557106, 7198262071269114212, 14396524142538228424, \r
                        2879304828507645684, 5758609657015291369, 11517219314030582739, \r
                        2303443862806116547, 4606887725612233095, 9213775451224466191, \r
-                       18427550902448932383, 3685510180489786476, 7371020360979572953, \r
+                       1842755090244893238, 3685510180489786476, 7371020360979572953, \r
                        14742040721959145907, 2948408144391829181, 5896816288783658362, \r
                        11793632577567316725, 2358726515513463345, 4717453031026926690, \r
                        9434906062053853380, 1886981212410770676, 3773962424821541352, \r
@@ -626,7 +626,7 @@ namespace System
                        3564406732517340014, 7128813465034680029, 14257626930069360058, \r
                        2851525386013872011, 5703050772027744023, 11406101544055488046, \r
                        2281220308811097609, 4562440617622195218, 9124881235244390437, \r
-                       18249762470488780874, 3649952494097756174, 7299904988195512349, \r
+                       1824976247048878087, 3649952494097756174, 7299904988195512349, \r
                        14599809976391024699, 2919961995278204939, 5839923990556409879, \r
                        11679847981112819759, 2335969596222563951, 4671939192445127903, \r
                        9343878384890255807, 1868775676978051161, 3737551353956102323, \r
@@ -691,7 +691,7 @@ namespace System
                        17899314949046850752, 3579862989809370150, 7159725979618740301, \r
                        14319451959237480602, 2863890391847496120, 5727780783694992240, \r
                        11455561567389984481, 2291112313477996896, 4582224626955993792, \r
-                       9164449253911987585, 18328898507823975170, 3665779701564795034, \r
+                       9164449253911987585, 1832889850782397517, 3665779701564795034, \r
                        7331559403129590068, 14663118806259180136, 2932623761251836027, \r
                        5865247522503672054, 11730495045007344109, 2346099009001468821, \r
                        4692198018002937643, 9384396036005875287, 1876879207201175057, \r
@@ -756,12 +756,12 @@ namespace System
                        8988465674311579538, 17976931348623159077, 3595386269724631815, \r
                        7190772539449263630, 14381545078898527261, 2876309015779705452, \r
                        5752618031559410904, 11505236063118821809, 2301047212623764361, \r
-                       4602094425247528723, 9204188850495057447, 18408377700990114895\r
+                       4602094425247528723, 9204188850495057447, 1840837770099011489, \r
                        3681675540198022979, 7363351080396045958, \r
                };\r
 \r
                static readonly int[] TensExponentTable = {\r
-                       -323, -323, -323, -322, -322, -322, -321, -321, -321, -320, -320, -320, \r
+                       -323, -323, -322, -322, -322, -322, -321, -321, -321, -320, -320, -320, \r
                        -319, -319, -319, -319, -318, -318, -318, -317, -317, -317, -316, -316, \r
                        -316, -316, -315, -315, -315, -314, -314, -314, -313, -313, -313, -313, \r
                        -312, -312, -312, -311, -311, -311, -310, -310, -310, -310, -309, -309, \r
@@ -777,7 +777,7 @@ namespace System
                        -276, -276, -276, -275, -275, -275, -274, -274, -274, -273, -273, -273, \r
                        -273, -272, -272, -272, -271, -271, -271, -270, -270, -270, -270, -269, \r
                        -269, -269, -268, -268, -268, -267, -267, -267, -267, -266, -266, -266, \r
-                       -265, -265, -265, -264, -264, -264, -264, -263, -263, -263, -262, -262, \r
+                       -265, -265, -265, -264, -264, -264, -263, -263, -263, -263, -262, -262, \r
                        -262, -261, -261, -261, -260, -260, -260, -260, -259, -259, -259, -258, \r
                        -258, -258, -257, -257, -257, -257, -256, -256, -256, -255, -255, -255, \r
                        -254, -254, -254, -254, -253, -253, -253, -252, -252, -252, -251, -251, \r
@@ -785,7 +785,7 @@ namespace System
                        -247, -247, -247, -246, -246, -246, -245, -245, -245, -245, -244, -244, \r
                        -244, -243, -243, -243, -242, -242, -242, -242, -241, -241, -241, -240, \r
                        -240, -240, -239, -239, -239, -239, -238, -238, -238, -237, -237, -237, \r
-                       -236, -236, -236, -236, -235, -235, -235, -234, -234, -234, -233, -233, \r
+                       -236, -236, -236, -235, -235, -235, -235, -234, -234, -234, -233, -233, \r
                        -233, -232, -232, -232, -232, -231, -231, -231, -230, -230, -230, -229, \r
                        -229, -229, -229, -228, -228, -228, -227, -227, -227, -226, -226, -226, \r
                        -226, -225, -225, -225, -224, -224, -224, -223, -223, -223, -223, -222, \r
@@ -793,7 +793,7 @@ namespace System
                        -218, -218, -218, -217, -217, -217, -217, -216, -216, -216, -215, -215, \r
                        -215, -214, -214, -214, -214, -213, -213, -213, -212, -212, -212, -211, \r
                        -211, -211, -211, -210, -210, -210, -209, -209, -209, -208, -208, -208, \r
-                       -208, -207, -207, -207, -206, -206, -206, -205, -205, -205, -205, -204, \r
+                       -208, -207, -207, -207, -206, -206, -206, -205, -205, -205, -204, -204, \r
                        -204, -204, -203, -203, -203, -202, -202, -202, -201, -201, -201, -201, \r
                        -200, -200, -200, -199, -199, -199, -198, -198, -198, -198, -197, -197, \r
                        -197, -196, -196, -196, -195, -195, -195, -195, -194, -194, -194, -193, \r
@@ -801,7 +801,7 @@ namespace System
                        -189, -189, -189, -189, -188, -188, -188, -187, -187, -187, -186, -186, \r
                        -186, -186, -185, -185, -185, -184, -184, -184, -183, -183, -183, -183, \r
                        -182, -182, -182, -181, -181, -181, -180, -180, -180, -180, -179, -179, \r
-                       -179, -178, -178, -178, -177, -177, -177, -177, -176, -176, -176, -175, \r
+                       -179, -178, -178, -178, -177, -177, -177, -176, -176, -176, -176, -175, \r
                        -175, -175, -174, -174, -174, -173, -173, -173, -173, -172, -172, -172, \r
                        -171, -171, -171, -170, -170, -170, -170, -169, -169, -169, -168, -168, \r
                        -168, -167, -167, -167, -167, -166, -166, -166, -165, -165, -165, -164, \r
@@ -817,7 +817,7 @@ namespace System
                        -132, -131, -131, -131, -130, -130, -130, -130, -129, -129, -129, -128, \r
                        -128, -128, -127, -127, -127, -127, -126, -126, -126, -125, -125, -125, \r
                        -124, -124, -124, -124, -123, -123, -123, -122, -122, -122, -121, -121, \r
-                       -121, -121, -120, -120, -120, -119, -119, -119, -118, -118, -118, -118\r
+                       -121, -121, -120, -120, -120, -119, -119, -119, -118, -118, -118, -117\r
                        -117, -117, -117, -116, -116, -116, -115, -115, -115, -114, -114, -114, \r
                        -114, -113, -113, -113, -112, -112, -112, -111, -111, -111, -111, -110, \r
                        -110, -110, -109, -109, -109, -108, -108, -108, -108, -107, -107, -107, \r
@@ -825,7 +825,7 @@ namespace System
                        -103, -102, -102, -102, -102, -101, -101, -101, -100, -100, -100, -99, \r
                        -99, -99, -99, -98, -98, -98, -97, -97, -97, -96, -96, -96, \r
                        -96, -95, -95, -95, -94, -94, -94, -93, -93, -93, -93, -92, \r
-                       -92, -92, -91, -91, -91, -90, -90, -90, -90, -89, -89, -89, \r
+                       -92, -92, -91, -91, -91, -90, -90, -90, -89, -89, -89, -89, \r
                        -88, -88, -88, -87, -87, -87, -86, -86, -86, -86, -85, -85, \r
                        -85, -84, -84, -84, -83, -83, -83, -83, -82, -82, -82, -81, \r
                        -81, -81, -80, -80, -80, -80, -79, -79, -79, -78, -78, -78, \r
@@ -834,7 +834,7 @@ namespace System
                        -70, -70, -70, -69, -69, -69, -68, -68, -68, -68, -67, -67, \r
                        -67, -66, -66, -66, -65, -65, -65, -65, -64, -64, -64, -63, \r
                        -63, -63, -62, -62, -62, -62, -61, -61, -61, -60, -60, -60, \r
-                       -59, -59, -59, -59, -58, -58, -58, -57, -57, -57, -56, -56, \r
+                       -59, -59, -59, -58, -58, -58, -58, -57, -57, -57, -56, -56, \r
                        -56, -55, -55, -55, -55, -54, -54, -54, -53, -53, -53, -52, \r
                        -52, -52, -52, -51, -51, -51, -50, -50, -50, -49, -49, -49, \r
                        -49, -48, -48, -48, -47, -47, -47, -46, -46, -46, -46, -45, \r
@@ -842,7 +842,7 @@ namespace System
                        -41, -41, -41, -40, -40, -40, -40, -39, -39, -39, -38, -38, \r
                        -38, -37, -37, -37, -37, -36, -36, -36, -35, -35, -35, -34, \r
                        -34, -34, -34, -33, -33, -33, -32, -32, -32, -31, -31, -31, \r
-                       -31, -30, -30, -30, -29, -29, -29, -28, -28, -28, -27, -27, \r
+                       -30, -30, -30, -30, -29, -29, -29, -28, -28, -28, -27, -27, \r
                        -27, -27, -26, -26, -26, -25, -25, -25, -24, -24, -24, -24, \r
                        -23, -23, -23, -22, -22, -22, -21, -21, -21, -21, -20, -20, \r
                        -20, -19, -19, -19, -18, -18, -18, -18, -17, -17, -17, -16, \r
@@ -858,7 +858,7 @@ namespace System
                        16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, \r
                        20, 20, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, \r
                        24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 27, 27, \r
-                       27, 28, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, \r
+                       27, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 31, \r
                        31, 31, 32, 32, 32, 32, 33, 33, 33, 34, 34, 34, \r
                        35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, \r
                        38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 41, \r
@@ -874,7 +874,7 @@ namespace System
                        74, 75, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, \r
                        78, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 81, \r
                        81, 82, 82, 82, 83, 83, 83, 84, 84, 84, 84, 85, \r
-                       85, 85, 86, 86, 86, 87, 87, 87, 87, 88, 88, 88, \r
+                       85, 85, 86, 86, 86, 87, 87, 87, 88, 88, 88, 88, \r
                        89, 89, 89, 90, 90, 90, 91, 91, 91, 91, 92, 92, \r
                        92, 93, 93, 93, 94, 94, 94, 94, 95, 95, 95, 96, \r
                        96, 96, 97, 97, 97, 97, 98, 98, 98, 99, 99, 99, \r
@@ -882,7 +882,7 @@ namespace System
                        103, 103, 104, 104, 104, 105, 105, 105, 106, 106, 106, 106, \r
                        107, 107, 107, 108, 108, 108, 109, 109, 109, 109, 110, 110, \r
                        110, 111, 111, 111, 112, 112, 112, 112, 113, 113, 113, 114, \r
-                       114, 114, 115, 115, 115, 115, 116, 116, 116, 117, 117, 117, \r
+                       114, 114, 115, 115, 115, 116, 116, 116, 116, 117, 117, 117, \r
                        118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 121, 121, \r
                        121, 122, 122, 122, 122, 123, 123, 123, 124, 124, 124, 125, \r
                        125, 125, 125, 126, 126, 126, 127, 127, 127, 128, 128, 128, \r
@@ -891,14 +891,14 @@ namespace System
                        136, 136, 136, 137, 137, 137, 137, 138, 138, 138, 139, 139, \r
                        139, 140, 140, 140, 140, 141, 141, 141, 142, 142, 142, 143, \r
                        143, 143, 143, 144, 144, 144, 145, 145, 145, 146, 146, 146, \r
-                       146, 147, 147, 147, 148, 148, 148, 149, 149, 149, 150, 150, \r
+                       147, 147, 147, 147, 148, 148, 148, 149, 149, 149, 150, 150, \r
                        150, 150, 151, 151, 151, 152, 152, 152, 153, 153, 153, 153, \r
                        154, 154, 154, 155, 155, 155, 156, 156, 156, 156, 157, 157, \r
                        157, 158, 158, 158, 159, 159, 159, 159, 160, 160, 160, 161, \r
                        161, 161, 162, 162, 162, 162, 163, 163, 163, 164, 164, 164, \r
                        165, 165, 165, 165, 166, 166, 166, 167, 167, 167, 168, 168, \r
                        168, 168, 169, 169, 169, 170, 170, 170, 171, 171, 171, 171, \r
-                       172, 172, 172, 173, 173, 173, 174, 174, 174, 174, 175, 175, \r
+                       172, 172, 172, 173, 173, 173, 174, 174, 174, 175, 175, 175, \r
                        175, 176, 176, 176, 177, 177, 177, 178, 178, 178, 178, 179, \r
                        179, 179, 180, 180, 180, 181, 181, 181, 181, 182, 182, 182, \r
                        183, 183, 183, 184, 184, 184, 184, 185, 185, 185, 186, 186, \r
@@ -915,7 +915,7 @@ namespace System
                        222, 223, 223, 223, 224, 224, 224, 224, 225, 225, 225, 226, \r
                        226, 226, 227, 227, 227, 227, 228, 228, 228, 229, 229, 229, \r
                        230, 230, 230, 230, 231, 231, 231, 232, 232, 232, 233, 233, \r
-                       233, 233, 234, 234, 234, 235, 235, 235, 236, 236, 236, 237, \r
+                       233, 234, 234, 234, 234, 235, 235, 235, 236, 236, 236, 237, \r
                        237, 237, 237, 238, 238, 238, 239, 239, 239, 240, 240, 240, \r
                        240, 241, 241, 241, 242, 242, 242, 243, 243, 243, 243, 244, \r
                        244, 244, 245, 245, 245, 246, 246, 246, 246, 247, 247, 247, \r
@@ -931,7 +931,7 @@ namespace System
                        280, 280, 281, 281, 281, 282, 282, 282, 283, 283, 283, 283, \r
                        284, 284, 284, 285, 285, 285, 286, 286, 286, 286, 287, 287, \r
                        287, 288, 288, 288, 289, 289, 289, 289, 290, 290, 290, 291, \r
-                       291, 291, 292, 292, 292, 292, 293, 293, \r
+                       291, 291, 292, 292, 292, 293, 293, 293, \r
                };\r
 \r
 #if false\r
@@ -942,8 +942,10 @@ namespace System
                // further the double ToString performance.\r
                private const int ExponentMid = 1043;\r
                private const int ExponentMax = 2047;\r
-               private const ulong UpperMapMark = UInt64.MaxValue / 2;\r
-               private const ulong LowerMapMark = UInt64.MaxValue / 5;\r
+\r
+               // Ensure that values won't cause overflow when multiplied with the double Mantissa.\r
+               private const ulong UpperMapMark = UInt64.MaxValue / 2 - (1 << 57);\r
+               private const ulong LowerMapMark = UInt64.MaxValue / 5 - (1 << 56);\r
 \r
                // The results of 2 ^ 64 / 5 * i for i in {0 .. 4}\r
                private static ulong[] Div5 = new ulong[] {\r
index 2f0d5cf3717ae2884747c6774a6d083f8c8cd969..e81d60f573a28c5302b68bcfd5b511288c463a2c 100644 (file)
@@ -1,3 +1,8 @@
+2008-05-27  Eyal Alaluf <eyala@mainsoft.com>
+
+       * NumberFormatterTest.cs: Add test for arithemtic overflow in
+         Double.ToString as exposed by Bug #383531.
+
 2008-05-25  Gert Driesen  <drieseng@users.sourceforge.net>
 
        * StringTest.cs: Added/improved tests for ToLower and ToUpper.
index c5ebca0291009ef06fb56710976518b4bd1c742d..dd32b3687c9b994f0f8578767a34a99d67f93399 100644 (file)
@@ -4287,6 +4287,21 @@ namespace MonoTests.System
                        AssertEquals ("#11", "3.40282347E+38", Single.MaxValue.ToString("R"));\r
                }\r
 \r
+               // Tests arithmetic overflow in double.ToString exposed by Bug #383531\r
+               [Test]\r
+               public void TestToStringOverflow()\r
+               {\r
+                       // Test all the possible double exponents with the maximal mantissa\r
+            long dblPattern = 0xfffffffffffff; // all 1s significand\r
+\r
+            for (long exp = 0; exp < 4096; exp++) {\r
+                double val = BitConverter.Int64BitsToDouble((long)(dblPattern | (exp << 52)));\r
+                string strRes = val.ToString("R", NumberFormatInfo.InvariantInfo);\r
+                               double rndTripVal = Double.Parse(strRes);\r
+                               AssertEquals ("Iter#" + exp, val, rndTripVal);\r
+            }\r
+               }\r
+\r
                // Test17000 - Double and X\r
                [Test]\r
                [ExpectedException (typeof (FormatException))]\r