Skip to content

Commit 2c8050d

Browse files
committed
Version 1.8.1
1 parent 3c355d7 commit 2c8050d

8 files changed

Lines changed: 233 additions & 253 deletions

File tree

Numbers.nuspec

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
<package
2-
><metadata><version>1.8.0</version><id>PeterO.Numbers</id><requireLicenseAcceptance>false</requireLicenseAcceptance><releaseNotes>Version 1.8
2+
><metadata><version>1.8.1</version><id>PeterO.Numbers</id><requireLicenseAcceptance>false</requireLicenseAcceptance><releaseNotes>Version 1.8.1
3+
4+
- Fix bugs in EFloat string parsing in certain corner cases
5+
- Fix NaN roundtripping with From/ToSingleBits and From/ToDoubleBits
6+
7+
Version 1.8
38

49
- Add LowBits family of methods to EInteger
510
- Add FromInt64AsUnsigned to EInteger, EDecimal, EFloat, and ERational
611
- Add overload to FromBytes method of EInteger
712
- Bug fixes</releaseNotes><summary></summary><license type='expression'>CC0-1.0</license><projectUrl>https://github.com/peteroupc/Numbers</projectUrl><authors>Peter Occil</authors><description>A C# library that supports arbitrary-precision binary and decimal floating-point numbers and rational numbers with arbitrary-precision components, and supports arithmetic with these numbers.</description><owners>Peter Occil</owners><title>Arbitrary-Precision Number Library</title><tags>numbers arithmetic decimal math</tags><dependencies><group targetFramework='.NETStandard1.0' /><group targetFramework='.NETFramework2.0' /><group targetFramework='.NETFramework4.0' /></dependencies></metadata><files><file src='Numbers/bin/Release/netstandard1.0/Numbers.dll' target='/lib/netstandard1.0' /><file src='Numbers/bin/Release/netstandard1.0/Numbers.xml' target='/lib/netstandard1.0' /><file src='Numbers20/bin/Release/Numbers.dll' target='/lib/net20' /><file src='Numbers20/bin/Release/Numbers.xml' target='/lib/net20' /><file src='Numbers40/bin/Release/Numbers.dll' target='/lib/net40' /><file src='Numbers40/bin/Release/Numbers.xml' target='/lib/net40' /></files></package
8-
>
13+
>

Numbers/PeterO/Numbers/RadixMath.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2301,8 +2301,10 @@ public T Power(T thisValue, T pow, EContext ctx) {
23012301
// thisValue is 1 and power is a negative integer, the reciprocal of 1
23022302
// is used, which will have an exponent of 0, according to the
23032303
// General Decimal Arithmetic Specification
2304-
return this.PowerIntegral(this.helper.ValueOf(1), signedMant,
2305-
ctx);
2304+
return this.PowerIntegral(
2305+
this.helper.ValueOf(1),
2306+
signedMant,
2307+
ctx);
23062308
} else {
23072309
return this.PowerIntegral(thisValue, signedMant, ctx);
23082310
}

Numbers/docs.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11364,9 +11364,6 @@
1136411364
<see cref='PeterO.Numbers.EDecimal'>"Forms of numbers"</see> ) for
1136511365
the purposes of this operator.</remarks>
1136611366

11367-
</doc>
11368-
<doc name="M:PeterO.Numbers.EInteger.Imply(PeterO.Numbers.EInteger)">
11369-
<param name='second'>The parameter <paramref name='second'/> is a Numbers.EInteger object.</param><returns>The return value is not documented yet.</returns><exception cref='ArgumentNullException'>The parameter <paramref name='second'/> is null.</exception>
1137011367
</doc>
1137111368
<doc name="M:PeterO.Numbers.EInteger.Increment">
1137211369

Numbers20/Properties/AssemblyInfo.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
using System.Reflection;
22
[assembly: System.CLSCompliant(true)]
3-
[assembly: AssemblyInformationalVersion("1.8.0")]
4-
[assembly: AssemblyVersion("1.8.0.0")]
5-
[assembly: AssemblyFileVersion("1.8.0.0")]
3+
[assembly: AssemblyInformationalVersion("1.8.1")]
4+
[assembly: AssemblyVersion("1.8.1.0")]
5+
[assembly: AssemblyFileVersion("1.8.1.0")]
66
[assembly: AssemblyProduct("Arbitrary-Precision Number Library")]
77
[assembly: AssemblyTitle("Arbitrary-Precision Number Library")]
88
[assembly: AssemblyDescription("A C# library that supports arbitrary-pre" +

Numbers40/Properties/AssemblyInfo.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
using System.Reflection;
22
[assembly: System.CLSCompliant(true)]
3-
[assembly: AssemblyInformationalVersion("1.8.0")]
4-
[assembly: AssemblyVersion("1.8.0.0")]
5-
[assembly: AssemblyFileVersion("1.8.0.0")]
3+
[assembly: AssemblyInformationalVersion("1.8.1")]
4+
[assembly: AssemblyVersion("1.8.1.0")]
5+
[assembly: AssemblyFileVersion("1.8.1.0")]
66
[assembly: AssemblyProduct("Arbitrary-Precision Number Library")]
77
[assembly: AssemblyTitle("Arbitrary-Precision Number Library")]
88
[assembly: AssemblyDescription("A C# library that supports arbitrary-pre" +

Test/EDecimalTest.cs

Lines changed: 155 additions & 155 deletions
Large diffs are not rendered by default.

Test/EFloatTest.cs

Lines changed: 60 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -318,19 +318,19 @@ public void TestEquals() {
318318
{
319319
object objectTemp =
320320

321-
EFloat.FromString("0.009461540475412139260145553670698466186015902447450593622262751970123371581303298477485466592231565609");
321+
EFloat.FromString("0.009461540475412139260145553670698466186015902447450593622262751970123371581303298477485466592231565609");
322322
object objectTemp2 =
323323

324-
EFloat.FromString("0.009461540475412139260145553670698466186015902447450593622262751970123371581303298477485466592231565609");
324+
EFloat.FromString("0.009461540475412139260145553670698466186015902447450593622262751970123371581303298477485466592231565609");
325325
Assert.AreEqual(objectTemp, objectTemp2);
326326
}
327327
{
328328
object objectTemp =
329329

330-
EFloat.FromString("0.009461540475412139260145553670698466186015902447450593622262751970123371581303298477485466592231565609");
330+
EFloat.FromString("0.009461540475412139260145553670698466186015902447450593622262751970123371581303298477485466592231565609");
331331
object objectTemp2 =
332332

333-
EFloat.FromString("0.001809476049361792727571247490438259768858020288404502743164967883090669271207537395819291033916115474");
333+
EFloat.FromString("0.001809476049361792727571247490438259768858020288404502743164967883090669271207537395819291033916115474");
334334
Assert.AreNotEqual(objectTemp, objectTemp2);
335335
}
336336
var r = new RandomGenerator();
@@ -872,23 +872,23 @@ public void TestIsZero() {
872872
Assert.IsFalse(EFloat.SignalingNaN.IsZero);
873873
}
874874

875-
[Test]
876-
public void TestCloseToPowerOfTwo() {
877-
string[] variations = {
878-
String.Empty, ".0", ".00", ".000",
879-
".4", ".40", ".6", ".60", ".5", ".50", ".500",
880-
};
881-
for (var i = 31; i < 129; ++i) {
882-
EInteger ei = EInteger.FromInt32(1).ShiftLeft(i);
883-
foreach (string vari in variations) {
884-
TestStringToDoubleSingleOne(ei.ToString() + vari);
885-
TestStringToDoubleSingleOne(ei.Add(1).ToString() + vari);
886-
TestStringToDoubleSingleOne(ei.Subtract(1).ToString() + vari);
887-
TestStringToDoubleSingleOne(ei.Add(2).ToString() + vari);
888-
TestStringToDoubleSingleOne(ei.Subtract(2).ToString() + vari);
889-
}
890-
}
891-
}
875+
[Test]
876+
public void TestCloseToPowerOfTwo() {
877+
string[] variations = {
878+
String.Empty, ".0", ".00", ".000",
879+
".4", ".40", ".6", ".60", ".5", ".50", ".500",
880+
};
881+
for (var i = 31; i < 129; ++i) {
882+
EInteger ei = EInteger.FromInt32(1).ShiftLeft(i);
883+
foreach (string vari in variations) {
884+
TestStringToDoubleSingleOne(ei.ToString() + vari);
885+
TestStringToDoubleSingleOne(ei.Add(1).ToString() + vari);
886+
TestStringToDoubleSingleOne(ei.Subtract(1).ToString() + vari);
887+
TestStringToDoubleSingleOne(ei.Add(2).ToString() + vari);
888+
TestStringToDoubleSingleOne(ei.Subtract(2).ToString() + vari);
889+
}
890+
}
891+
}
892892

893893
public static void TestParseNumberFxxLine(string line) {
894894
// Parse test case format used in:
@@ -914,41 +914,42 @@ public static void TestParseNumberFxxLine(string line) {
914914

915915
public static void TestParseNumberFxx(
916916
string str,
917-
short _f16,
917+
short f16,
918918
int f32,
919919
long f64,
920920
string line) {
921-
// TODO: Support f16 test
922-
// TODO: Add From/ToHalfBits in EDecimal/EFloat/ERational
923-
EFloat efsng = EFloat.FromSingleBits(f32);
924-
EFloat efdbl = EFloat.FromDoubleBits(f64);
925-
// Begin test
926-
if (efsng.IsFinite) {
927-
TestStringToSingleOne(str);
928-
}
929-
if (efdbl.IsFinite) {
930-
TestStringToDoubleOne(str);
931-
}
932-
EFloat ef;
933-
ef = EFloat.FromString(str, EContext.Binary64);
934-
Assert.AreEqual(f64, ef.ToDoubleBits(), line);
935-
ef = EFloat.FromString(str, EContext.Binary32);
936-
Assert.AreEqual(f32, ef.ToSingleBits(), line);
937-
ef = EFloat.FromString(
921+
Assert.AreEqual(f16, f16);
922+
// TODO: Support f16 test
923+
// TODO: Add From/ToHalfBits in EDecimal/EFloat/ERational
924+
EFloat efsng = EFloat.FromSingleBits(f32);
925+
EFloat efdbl = EFloat.FromDoubleBits(f64);
926+
// Begin test
927+
if (efsng.IsFinite) {
928+
TestStringToSingleOne(str);
929+
}
930+
if (efdbl.IsFinite) {
931+
TestStringToDoubleOne(str);
932+
}
933+
EFloat ef;
934+
ef = EFloat.FromString(str, EContext.Binary64);
935+
Assert.AreEqual(f64, ef.ToDoubleBits(), line);
936+
ef = EFloat.FromString(str, EContext.Binary32);
937+
Assert.AreEqual(f32, ef.ToSingleBits(), line);
938+
ef = EFloat.FromString(
938939
"xxx" + str + "xxx",
939940
3,
940941
str.Length,
941942
EContext.Binary64);
942-
Assert.AreEqual(f64, ef.ToDoubleBits(), line);
943-
ef = EFloat.FromString(
943+
Assert.AreEqual(f64, ef.ToDoubleBits(), line);
944+
ef = EFloat.FromString(
944945
"xxx" + str + "xxx",
945946
3,
946947
str.Length,
947948
EContext.Binary32);
948-
Assert.AreEqual(f32, ef.ToSingleBits(), line);
949-
EDecimal ed = EDecimal.FromString(str);
950-
Assert.AreEqual(ed.ToSingleBits(), f32, str);
951-
Assert.AreEqual(ed.ToDoubleBits(), f64, str);
949+
Assert.AreEqual(f32, ef.ToSingleBits(), line);
950+
EDecimal ed = EDecimal.FromString(str);
951+
Assert.AreEqual(ed.ToSingleBits(), f32, str);
952+
Assert.AreEqual(ed.ToDoubleBits(), f64, str);
952953
}
953954

954955
[Test]
@@ -1016,7 +1017,7 @@ public void TestLog() {
10161017
[Test]
10171018
public void TestLogExpSpecificA() {
10181019
EFloat efa = EFloat.Create(5094638944929121L,
1019-
-43).ExpM1(EContext.Binary64);
1020+
-43).ExpM1(EContext.Binary64);
10201021
EInteger mant = efa.Mantissa;
10211022
Assert.IsTrue(mant.Abs().GetUnsignedBitLengthAsInt64() <= 53);
10221023
EFloat efb = EFloat.Create(6823497764200007L, 783);
@@ -1035,7 +1036,7 @@ public void TestLogExpSpecificB() {
10351036
[Test]
10361037
public void TestLogExpSpecificC() {
10371038
EFloat efa = EFloat.Create(-1184982539430741L,
1038-
-52).Exp(EContext.Binary64);
1039+
-52).Exp(EContext.Binary64);
10391040
EInteger mant = efa.Mantissa;
10401041
Assert.IsTrue(mant.Abs().GetUnsignedBitLengthAsInt64() <= 53);
10411042
EFloat efb = EFloat.Create(6923387652188847L, -53);
@@ -1045,15 +1046,15 @@ public void TestLogExpSpecificC() {
10451046
[Test]
10461047
public void TestLogExpSpecificD() {
10471048
EFloat efa = EFloat.Create(6832986215039611L,
1048-
-38).Log1P(EContext.Binary64);
1049+
-38).Log1P(EContext.Binary64);
10491050
EFloat efb = EFloat.Create(1424402087294909L, -47);
10501051
string str = OutputEF(efb) + "\n" + OutputEF(efa);
10511052
TestCommon.CompareTestEqual(efb, efa, str);
10521053
}
10531054
[Test]
10541055
public void TestLogExpSpecificE() {
10551056
EFloat efa = EFloat.Create(5615046595603761L,
1056-
-44).ExpM1(EContext.Binary64);
1057+
-44).ExpM1(EContext.Binary64);
10571058
EInteger mant = efa.Mantissa;
10581059
Assert.IsTrue(mant.Abs().GetUnsignedBitLengthAsInt64() <= 53);
10591060
EFloat efb = EFloat.Create(6269016557695007L, 408);
@@ -2125,10 +2126,10 @@ public void TestCloseToOverflowSpecific() {
21252126
false).WithExponentClamp(true).WithSimplified(false);
21262127
EInteger emant =
21272128

2128-
EInteger.FromString("88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888");
2129+
EInteger.FromString("88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888");
21292130
EInteger eexp =
21302131

2131-
EInteger.FromString("1000000000000000000000000000000000000000000000000000000000000");
2132+
EInteger.FromString("1000000000000000000000000000000000000000000000000000000000000");
21322133
EFloat efmant = EFloat.FromEInteger(emant);
21332134
EFloat efexp = EFloat.FromEInteger(eexp);
21342135
EFloat ef2 = efmant.Multiply(efexp, ec);
@@ -2143,10 +2144,10 @@ public void TestCloseToOverflowSpecific() {
21432144
public void TestStringToDoubleSpecificA() {
21442145
string str =
21452146

2146-
"395327047447757233151852025916007341543830859020311182348280049405196796002596109672166636419495856284607016106216608940280159980410562166599659829549836399698289289291865158130408917411887384321629920907652092446340673107744633313627817849916899822288644199811238047243389339131191051062809216261025215824523.4450649076678708780046658731481724174843552673744114894507741447375332545091864773666544122664744761333144781246291659228465651037706198817528715653479238826021855332253112859123685832653222952164708641577926580176434675271038652656763152189489079211898438385589908245057380361924564889535903026779733005698423207728797753101352096950270825633677221801202735885609696599439158086869381984718373482202897732285374878471795568389970731523802567947950548336665365358918558902407299370109971613731348136804887326596306602541763433746075226973971630905830686044475031568633180101625817896363428603835057150659940109566037118543874354367476000190935017225290762348459773388606367426256772899921636";
2147+
"395327047447757233151852025916007341543830859020311182348280049405196796002596109672166636419495856284607016106216608940280159980410562166599659829549836399698289289291865158130408917411887384321629920907652092446340673107744633313627817849916899822288644199811238047243389339131191051062809216261025215824523.4450649076678708780046658731481724174843552673744114894507741447375332545091864773666544122664744761333144781246291659228465651037706198817528715653479238826021855332253112859123685832653222952164708641577926580176434675271038652656763152189489079211898438385589908245057380361924564889535903026779733005698423207728797753101352096950270825633677221801202735885609696599439158086869381984718373482202897732285374878471795568389970731523802567947950548336665365358918558902407299370109971613731348136804887326596306602541763433746075226973971630905830686044475031568633180101625817896363428603835057150659940109566037118543874354367476000190935017225290762348459773388606367426256772899921636";
21472148
string strb =
21482149

2149-
"179769313486231580793728971405303415079934132710037826936173778980444968292764750946649017977587207096330286416692887910946555547851940402630657488671505820681908902000708383676273854845817711531764475730270069855571366959622842914819860834936475292719074168444365510704342711559699508093042880177904174497792";
2150+
"179769313486231580793728971405303415079934132710037826936173778980444968292764750946649017977587207096330286416692887910946555547851940402630657488671505820681908902000708383676273854845817711531764475730270069855571366959622842914819860834936475292719074168444365510704342711559699508093042880177904174497792";
21502151
EDecimal eda = EDecimal.FromString(str);
21512152
EDecimal edb = EDecimal.FromString(strb);
21522153
TestCommon.CompareTestLess(edb, eda);
@@ -2958,17 +2959,19 @@ public void TestToDoubleRounding() {
29582959
TestToFloatRoundingOne(objectTemp, true);
29592960
}
29602961
{
2962+
string rrs = "-1000000000000000000000000000" +
2963+
"0000000000000000000000000";
29612964
EFloat objectTemp = EFloat.Create(
2962-
EInteger.FromRadixString("-10000000000000000000000000000000000000000000000000000", 2),
2963-
EInteger.FromInt32(-1074));
2965+
EInteger.FromRadixString(rrs, 2),
2966+
EInteger.FromInt32(-1074));
29642967
TestToFloatRoundingOne(objectTemp, true);
29652968
objectTemp = EFloat.Create(
29662969
EInteger.FromRadixString("1010011", 2),
29672970
EInteger.FromInt32(-1034));
29682971
TestToFloatRoundingOne(objectTemp, true);
29692972
objectTemp = EFloat.Create(
2970-
EInteger.FromRadixString("100110100000000011000010111000111111101", 2),
2971-
EInteger.FromInt32(-1073));
2973+
EInteger.FromRadixString("100110100000000011000010111000111111101", 2),
2974+
EInteger.FromInt32(-1073));
29722975
TestToFloatRoundingOne(objectTemp, true);
29732976
}
29742977
}

0 commit comments

Comments
 (0)