Skip to content

Commit 3c355d7

Browse files
committed
fix NaN roundtripping; update dev dependencies; etc.
1 parent a96d670 commit 3c355d7

10 files changed

Lines changed: 194 additions & 24 deletions

File tree

Numbers/Numbers.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ licensed under Creative Commons Zero (CC0): https://creativecommons.org/publicdo
1818
Version 1.8.1
1919

2020
- Fix bugs in EFloat string parsing in certain corner cases
21+
- Fix NaN roundtripping with From/ToSingleBits and From/ToDoubleBits
2122

2223
Version 1.8
2324

Numbers/PeterO/Numbers/EDecimal.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -926,7 +926,7 @@ public static EDecimal FromDoubleBits(long dblBits) {
926926
lvalue = unchecked((value[0] & 0xffffffffL) | ((long)value[1] << 32));
927927
int flags = (neg ? BigNumberFlags.FlagNegative : 0) | (quiet ?
928928
BigNumberFlags.FlagQuietNaN : BigNumberFlags.FlagSignalingNaN);
929-
return lvalue == 0 ? (quiet ? NaN : SignalingNaN) :
929+
return (lvalue == 0 && !neg) ? (quiet ? NaN : SignalingNaN) :
930930
new EDecimal(
931931
FastIntegerFixed.FromInt64(lvalue),
932932
FastIntegerFixed.Zero,
@@ -1186,7 +1186,7 @@ public static EDecimal FromSingleBits(int value) {
11861186
value = (neg ? BigNumberFlags.FlagNegative : 0) |
11871187
(quiet ? BigNumberFlags.FlagQuietNaN :
11881188
BigNumberFlags.FlagSignalingNaN);
1189-
return valueFpMantissa == 0 ? (quiet ? NaN : SignalingNaN) :
1189+
return (valueFpMantissa == 0 && !neg) ? (quiet ? NaN : SignalingNaN) :
11901190
new EDecimal(
11911191
FastIntegerFixed.FromInt32(valueFpMantissa),
11921192
FastIntegerFixed.Zero,

Numbers/PeterO/Numbers/EFloat.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,7 @@ public static EFloat FromDoubleBits(long dblBits) {
593593
// Treat high bit of mantissa as quiet/signaling bit
594594
bool quiet = ((dblBits >> 32) & 0x80000) != 0;
595595
lvalue = dblBits & ((1L << 51) - 1);
596-
if (lvalue == 0) {
596+
if (lvalue == 0 && !neg) {
597597
return quiet ? NaN : SignalingNaN;
598598
}
599599
int flags = (neg ? BigNumberFlags.FlagNegative : 0) |
@@ -688,7 +688,7 @@ public static EFloat FromSingleBits(int value) {
688688
bigmant = (EInteger)valueFpMantissa;
689689
value = (neg ? BigNumberFlags.FlagNegative : 0) | (quiet ?
690690
BigNumberFlags.FlagQuietNaN : BigNumberFlags.FlagSignalingNaN);
691-
if (bigmant.IsZero) {
691+
if (bigmant.IsZero && !neg) {
692692
return quiet ? NaN : SignalingNaN;
693693
}
694694
return CreateWithFlags(

Numbers20/packages.config

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
<?xml version='1.0' encoding='UTF-8'?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3-
<package id='StyleCop.Analyzers' version='1.2.0-beta.333' targetFramework='net20' developmentDependency='true'>
4-
</package>
5-
<package id='Microsoft.CodeAnalysis.NetAnalyzers' version='5.0.3' targetFramework='net20' developmentDependency='true'/>
3+
<package id="Microsoft.CodeAnalysis.NetAnalyzers" version="5.0.3" targetFramework="net20" developmentDependency="true" />
4+
<package id="StyleCop.Analyzers" version="1.2.0-beta.354" targetFramework="net20" developmentDependency="true"></package>
5+
<package id="StyleCop.Analyzers.Unstable" version="1.2.0.354" targetFramework="net20" developmentDependency="true" />
66
</packages>

Numbers40/packages.config

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
<?xml version='1.0' encoding='UTF-8'?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3-
<package id='StyleCop.Analyzers' version='1.2.0-beta.333' targetFramework='net40' developmentDependency='true'>
4-
</package>
5-
<package id='Microsoft.CodeAnalysis.NetAnalyzers' version='5.0.3' targetFramework='net40' developmentDependency='true'/>
3+
<package id="Microsoft.CodeAnalysis.NetAnalyzers" version="5.0.3" targetFramework="net40" developmentDependency="true" />
4+
<package id="StyleCop.Analyzers" version="1.2.0-beta.354" targetFramework="net40" developmentDependency="true"></package>
5+
<package id="StyleCop.Analyzers.Unstable" version="1.2.0.354" targetFramework="net40" developmentDependency="true" />
66
</packages>

Test/EDecimalTest.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,38 @@ public void TestCompareToBinary() {
274274
}
275275
}
276276

277+
[Test]
278+
public void TestFromSingleBitsNaN() {
279+
int bits = unchecked((int)0xffc00000);
280+
Assert.AreEqual(bits, EDecimal.FromSingleBits(bits).ToSingleBits());
281+
bits = 0x7fc00000;
282+
Assert.AreEqual(bits, EDecimal.FromSingleBits(bits).ToSingleBits());
283+
bits = unchecked((int)0xffc00000);
284+
Assert.AreEqual(bits, EFloat.FromSingleBits(bits).ToSingleBits());
285+
bits = 0x7fc00000;
286+
Assert.AreEqual(bits, EFloat.FromSingleBits(bits).ToSingleBits());
287+
bits = unchecked((int)0xffc00000);
288+
Assert.AreEqual(bits, ERational.FromSingleBits(bits).ToSingleBits());
289+
bits = 0x7fc00000;
290+
Assert.AreEqual(bits, ERational.FromSingleBits(bits).ToSingleBits());
291+
}
292+
293+
[Test]
294+
public void TestFromDoubleBitsNaN() {
295+
long lbits = unchecked((long)0xfff8000000000000);
296+
Assert.AreEqual(lbits, EDecimal.FromDoubleBits(lbits).ToDoubleBits());
297+
lbits = 0x7ff8000000000000L;
298+
Assert.AreEqual(lbits, EDecimal.FromDoubleBits(lbits).ToDoubleBits());
299+
lbits = unchecked((long)0xfff8000000000000);
300+
Assert.AreEqual(lbits, EFloat.FromDoubleBits(lbits).ToDoubleBits());
301+
lbits = 0x7ff8000000000000L;
302+
Assert.AreEqual(lbits, EFloat.FromDoubleBits(lbits).ToDoubleBits());
303+
lbits = unchecked((long)0xfff8000000000000);
304+
Assert.AreEqual(lbits, ERational.FromDoubleBits(lbits).ToDoubleBits());
305+
lbits = 0x7ff8000000000000L;
306+
Assert.AreEqual(lbits, ERational.FromDoubleBits(lbits).ToDoubleBits());
307+
}
308+
277309
[Test]
278310
public void TestCompareToBinarySpecific1A() {
279311
EFloat ef;

Test/EFloatTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -902,7 +902,7 @@ public static void TestParseNumberFxxLine(string line) {
902902
Assert.Fail(line);
903903
}
904904
string f64 = line.Substring(4 + 1 + 8 + 1, 16);
905-
if (line[4+1+8 + 17] != ' ') {
905+
if (line[4 + 26] != ' ') {
906906
Assert.Fail(line);
907907
}
908908
string str = line.Substring(4 + 1 + 8 + 1 + 16 + 1);

Test20/packages.config

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
<?xml version='1.0' encoding='UTF-8'?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3-
<package developmentDependency='true' id='NUnitTestAdapter.WithFramework' targetFramework='net20' version='2.0.0'/>
4-
<package id='StyleCop.Analyzers' version='1.2.0-beta.333' targetFramework='net20' developmentDependency='true'>
5-
</package>
6-
<package id='Microsoft.CodeAnalysis.NetAnalyzers' version='5.0.3' targetFramework='net20' developmentDependency='true'/>
3+
<package id="Microsoft.CodeAnalysis.NetAnalyzers" version="5.0.3" targetFramework="net20" developmentDependency="true" />
4+
<package developmentDependency="true" id="NUnitTestAdapter.WithFramework" targetFramework="net20" version="2.0.0" />
5+
<package id="StyleCop.Analyzers" version="1.2.0-beta.354" targetFramework="net20" developmentDependency="true"></package>
6+
<package id="StyleCop.Analyzers.Unstable" version="1.2.0.354" targetFramework="net20" developmentDependency="true" />
77
</packages>

Test40/Test40.csproj

Lines changed: 138 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,138 @@
1-
<?xml version='1.0' encoding='UTF-8'?><Project DefaultTargets='Build' ToolsVersion='4.0' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'><Import Condition='Exists(&apos;..\packages\NUnit.3.12.0\build\NUnit.props&apos;)' Project='..\packages\NUnit.3.12.0\build\NUnit.props'/><PropertyGroup><Configuration Condition=' &apos;$(Configuration)&apos; == &apos;&apos; '>Debug</Configuration><Platform Condition=' &apos;$(Platform)&apos; == &apos;&apos; '>AnyCPU</Platform><ProjectGuid>{00EB31B6-A805-4EFB-A64B-9F8176B2A1CC}</ProjectGuid><OutputType>Exe</OutputType><AssemblyName>Test40</AssemblyName><CodeAnalysisRuleSet>rules.ruleset</CodeAnalysisRuleSet></PropertyGroup><PropertyGroup Condition=' &apos;$(Configuration)&apos;==&apos;Debug&apos; '><DebugSymbols>true</DebugSymbols><DebugType>full</DebugType><Optimize>false</Optimize><OutputPath>bin\Debug</OutputPath><DefineConstants>DEBUG;NET40</DefineConstants><ErrorReport>prompt</ErrorReport><WarningLevel>4</WarningLevel><ExternalConsole>true</ExternalConsole><CodeAnalysisRuleSet>rules.ruleset</CodeAnalysisRuleSet></PropertyGroup><PropertyGroup Condition=' &apos;$(Configuration)&apos;==&apos;Release&apos; '><Optimize>true</Optimize><OutputPath>bin\Release</OutputPath><ErrorReport>prompt</ErrorReport><DefineConstants>NET40</DefineConstants><WarningLevel>4</WarningLevel><ExternalConsole>true</ExternalConsole><CodeAnalysisRuleSet>rules.ruleset</CodeAnalysisRuleSet></PropertyGroup><ItemGroup><Reference Include='System'/><Reference Include='System.Numerics'/><PackageReference Include='NUnit'><Version>3.12.0</Version></PackageReference><PackageReference Include='StyleCop.Analyzers'><Version>1.1.118</Version></PackageReference><PackageReference Include='Microsoft.CodeAnalysis.NetAnalyzers'><Version>5.0.3</Version></PackageReference><Compile Include='../Test/EDecimalTest.cs'><Link>EDecimalTest.cs</Link></Compile><Compile Include='../Test/EContextTest.cs'><Link>EContextTest.cs</Link></Compile><Compile Include='../Test/IRandomGenExtended.cs'><Link>IRandomGenExtended.cs</Link></Compile><Compile Include='../Test/XorShift128Plus.cs'><Link>XorShift128Plus.cs</Link></Compile><AdditionalFiles Include='../Test/stylecop.json'><Link>stylecop.json</Link></AdditionalFiles><Compile Include='../Test/RandomObjects.cs'><Link>RandomObjects.cs</Link></Compile><Compile Include='../Test/AppResources.cs'><Link>AppResources.cs</Link></Compile><Compile Include='../Test/TestCommon.cs'><Link>TestCommon.cs</Link></Compile><Compile Include='../Test/ETrapExceptionTest.cs'><Link>ETrapExceptionTest.cs</Link></Compile><Compile Include='../Test/SevenBitEncoded.cs'><Link>SevenBitEncoded.cs</Link></Compile><Compile Include='../Test/EIntegerTest.cs'><Link>EIntegerTest.cs</Link></Compile><Compile Include='../Test/RandomGenerator.cs'><Link>RandomGenerator.cs</Link></Compile><Compile Include='../Test/ExtraTest.cs'><Link>ExtraTest.cs</Link></Compile><Compile Include='../Test/StringAndBigInt.cs'><Link>StringAndBigInt.cs</Link></Compile><Compile Include='../Test/DecTestUtil.cs'><Link>DecTestUtil.cs</Link></Compile><EmbeddedResource Include='../Test/Resources.restext'><Link>Resources.restext</Link><LogicalName>Resources.resources</LogicalName></EmbeddedResource><Compile Include='../Test/DecimalTest.cs'><Link>DecimalTest.cs</Link></Compile><Compile Include='../Test/Runner.cs'><Link>Runner.cs</Link></Compile><Compile Include='../Test/ExtensiveTest.cs'><Link>ExtensiveTest.cs</Link></Compile><Compile Include='../Test/ERationalTest.cs'><Link>ERationalTest.cs</Link></Compile><Compile Include='../Test/IRandomGen.cs'><Link>IRandomGen.cs</Link></Compile><Compile Include='../Test/EFloatTest.cs'><Link>EFloatTest.cs</Link></Compile><Compile Include='Properties/AssemblyInfo.cs'/><AdditionalFiles Include='stylecop.json'></AdditionalFiles><AdditionalFiles Include='rules.ruleset'></AdditionalFiles></ItemGroup><ItemGroup><ProjectReference Include='..\Numbers40\Numbers40.csproj'><Project>{D7E09F55-3156-44B0-87D9-1BABCBB398D9}</Project><Name>Test40</Name></ProjectReference></ItemGroup><Import Project='$(MSBuildToolsPath)\Microsoft.CSharp.targets'/><PropertyGroup><TargetFrameworkVersion>v4.0</TargetFrameworkVersion><RuntimeIdentifiers>win</RuntimeIdentifiers></PropertyGroup></Project>
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<Import Project="../packages/NUnit.3.13.2/build/NUnit.props" Condition="Exists('../packages/NUnit.3.13.2/build/NUnit.props')" />
4+
<PropertyGroup>
5+
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
6+
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
7+
<ProjectGuid>{00EB31B6-A805-4EFB-A64B-9F8176B2A1CC}</ProjectGuid>
8+
<OutputType>Exe</OutputType>
9+
<AssemblyName>Test40</AssemblyName>
10+
<CodeAnalysisRuleSet>rules.ruleset</CodeAnalysisRuleSet>
11+
</PropertyGroup>
12+
<PropertyGroup Condition=" '$(Configuration)'=='Debug' ">
13+
<DebugSymbols>true</DebugSymbols>
14+
<DebugType>full</DebugType>
15+
<Optimize>false</Optimize>
16+
<OutputPath>bin\Debug</OutputPath>
17+
<DefineConstants>DEBUG;NET40</DefineConstants>
18+
<ErrorReport>prompt</ErrorReport>
19+
<WarningLevel>4</WarningLevel>
20+
<ExternalConsole>true</ExternalConsole>
21+
<CodeAnalysisRuleSet>rules.ruleset</CodeAnalysisRuleSet>
22+
</PropertyGroup>
23+
<PropertyGroup Condition=" '$(Configuration)'=='Release' ">
24+
<Optimize>true</Optimize>
25+
<OutputPath>bin\Release</OutputPath>
26+
<ErrorReport>prompt</ErrorReport>
27+
<DefineConstants>NET40</DefineConstants>
28+
<WarningLevel>4</WarningLevel>
29+
<ExternalConsole>true</ExternalConsole>
30+
<CodeAnalysisRuleSet>rules.ruleset</CodeAnalysisRuleSet>
31+
</PropertyGroup>
32+
<ItemGroup>
33+
<Reference Include="nunit.framework, Version=3.13.2.0, Culture=neutral, PublicKeyToken=2638cd05610744eb">
34+
<HintPath>../packages/NUnit.3.13.2/lib/net40/nunit.framework.dll</HintPath>
35+
<Private>True</Private>
36+
</Reference>
37+
<Reference Include="System" />
38+
<Reference Include="System.Numerics" />
39+
<PackageReference Include="NUnit">
40+
<Version>3.12.0</Version>
41+
</PackageReference>
42+
<PackageReference Include="StyleCop.Analyzers">
43+
<Version>1.1.118</Version>
44+
</PackageReference>
45+
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers">
46+
<Version>5.0.3</Version>
47+
</PackageReference>
48+
<Compile Include="../Test/EDecimalTest.cs">
49+
<Link>EDecimalTest.cs</Link>
50+
</Compile>
51+
<Compile Include="../Test/EContextTest.cs">
52+
<Link>EContextTest.cs</Link>
53+
</Compile>
54+
<Compile Include="../Test/IRandomGenExtended.cs">
55+
<Link>IRandomGenExtended.cs</Link>
56+
</Compile>
57+
<Compile Include="../Test/XorShift128Plus.cs">
58+
<Link>XorShift128Plus.cs</Link>
59+
</Compile>
60+
<AdditionalFiles Include="../Test/stylecop.json">
61+
<Link>stylecop.json</Link>
62+
</AdditionalFiles>
63+
<Compile Include="../Test/RandomObjects.cs">
64+
<Link>RandomObjects.cs</Link>
65+
</Compile>
66+
<Compile Include="../Test/AppResources.cs">
67+
<Link>AppResources.cs</Link>
68+
</Compile>
69+
<Compile Include="../Test/TestCommon.cs">
70+
<Link>TestCommon.cs</Link>
71+
</Compile>
72+
<Compile Include="../Test/ETrapExceptionTest.cs">
73+
<Link>ETrapExceptionTest.cs</Link>
74+
</Compile>
75+
<Compile Include="../Test/SevenBitEncoded.cs">
76+
<Link>SevenBitEncoded.cs</Link>
77+
</Compile>
78+
<Compile Include="../Test/EIntegerTest.cs">
79+
<Link>EIntegerTest.cs</Link>
80+
</Compile>
81+
<Compile Include="../Test/RandomGenerator.cs">
82+
<Link>RandomGenerator.cs</Link>
83+
</Compile>
84+
<Compile Include="../Test/ExtraTest.cs">
85+
<Link>ExtraTest.cs</Link>
86+
</Compile>
87+
<Compile Include="../Test/StringAndBigInt.cs">
88+
<Link>StringAndBigInt.cs</Link>
89+
</Compile>
90+
<Compile Include="../Test/DecTestUtil.cs">
91+
<Link>DecTestUtil.cs</Link>
92+
</Compile>
93+
<EmbeddedResource Include="../Test/Resources.restext">
94+
<Link>Resources.restext</Link>
95+
<LogicalName>Resources.resources</LogicalName>
96+
</EmbeddedResource>
97+
<Compile Include="../Test/DecimalTest.cs">
98+
<Link>DecimalTest.cs</Link>
99+
</Compile>
100+
<Compile Include="../Test/Runner.cs">
101+
<Link>Runner.cs</Link>
102+
</Compile>
103+
<Compile Include="../Test/ExtensiveTest.cs">
104+
<Link>ExtensiveTest.cs</Link>
105+
</Compile>
106+
<Compile Include="../Test/ERationalTest.cs">
107+
<Link>ERationalTest.cs</Link>
108+
</Compile>
109+
<Compile Include="../Test/IRandomGen.cs">
110+
<Link>IRandomGen.cs</Link>
111+
</Compile>
112+
<Compile Include="../Test/EFloatTest.cs">
113+
<Link>EFloatTest.cs</Link>
114+
</Compile>
115+
<Compile Include="Properties/AssemblyInfo.cs" />
116+
<AdditionalFiles Include="stylecop.json">
117+
</AdditionalFiles>
118+
<AdditionalFiles Include="rules.ruleset">
119+
</AdditionalFiles>
120+
</ItemGroup>
121+
<ItemGroup>
122+
<ProjectReference Include="..\Numbers40\Numbers40.csproj">
123+
<Project>{D7E09F55-3156-44B0-87D9-1BABCBB398D9}</Project>
124+
<Name>Test40</Name>
125+
</ProjectReference>
126+
</ItemGroup>
127+
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
128+
<PropertyGroup>
129+
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
130+
<RuntimeIdentifiers>win</RuntimeIdentifiers>
131+
</PropertyGroup>
132+
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
133+
<PropertyGroup>
134+
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.The missing file is {0}.</ErrorText>
135+
</PropertyGroup>
136+
<Error Condition="!Exists('../packages/NUnit.3.13.2/build/NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '../packages/NUnit.3.13.2/build/NUnit.props'))" />
137+
</Target>
138+
</Project>

Test40/packages.config

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
<?xml version='1.0' encoding='UTF-8'?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3-
<package id='NUnit' targetFramework='net40' version='3.12.0'/>
4-
<package id='StyleCop.Analyzers' version='1.2.0-beta.333' targetFramework='net40' developmentDependency='true'>
5-
</package>
6-
<package id='Microsoft.CodeAnalysis.NetAnalyzers' version='5.0.3' targetFramework='net40' developmentDependency='true'/>
3+
<package id="Microsoft.CodeAnalysis.NetAnalyzers" version="5.0.3" targetFramework="net40" developmentDependency="true" />
4+
<package id="NUnit" targetFramework="net40" version="3.13.2" />
5+
<package id="StyleCop.Analyzers" version="1.2.0-beta.354" targetFramework="net40" developmentDependency="true"></package>
6+
<package id="StyleCop.Analyzers.Unstable" version="1.2.0.354" targetFramework="net40" developmentDependency="true" />
77
</packages>

0 commit comments

Comments
 (0)