Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
|
|
@ -0,0 +1,69 @@
|
|||
#define USE_BIGRATIONAL
|
||||
#define BANDED_ROWS
|
||||
#define INCREASED_LIMITS
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Numerics;
|
||||
using Numerics;
|
||||
|
||||
using static Common;
|
||||
using static Task1;
|
||||
using static Task2;
|
||||
using static Task3;
|
||||
|
||||
#if !USE_BIGRATIONAL
|
||||
// Mock structure to make test code work.
|
||||
struct BigRational
|
||||
{
|
||||
public override string ToString() => "NOT USING BIGRATIONAL";
|
||||
public static explicit operator decimal(BigRational value) => -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
static class Common
|
||||
{
|
||||
public const string FMT_STR = "{0,4} {1,-15:G9} {2,-24:G17} {3,-32} {4,-32}";
|
||||
public static string Headings { get; } =
|
||||
string.Format(
|
||||
CultureInfo.InvariantCulture,
|
||||
FMT_STR,
|
||||
new[] { "N", "Single", "Double", "Decimal", "BigRational (rounded as Decimal)" });
|
||||
|
||||
[Conditional("BANDED_ROWS")]
|
||||
static void SetConsoleFormat(int n)
|
||||
{
|
||||
if (n % 2 == 0)
|
||||
{
|
||||
Console.BackgroundColor = ConsoleColor.Black;
|
||||
Console.ForegroundColor = ConsoleColor.White;
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.BackgroundColor = ConsoleColor.White;
|
||||
Console.ForegroundColor = ConsoleColor.Black;
|
||||
}
|
||||
}
|
||||
|
||||
public static string FormatOutput(int n, (float sn, double db, decimal dm, BigRational br) x)
|
||||
{
|
||||
SetConsoleFormat(n);
|
||||
return string.Format(CultureInfo.CurrentCulture, FMT_STR, n, x.sn, x.db, x.dm, (decimal)x.br);
|
||||
}
|
||||
|
||||
static void Main()
|
||||
{
|
||||
WrongConvergence();
|
||||
|
||||
Console.WriteLine();
|
||||
ChaoticBankSociety();
|
||||
|
||||
Console.WriteLine();
|
||||
SiegfriedRump();
|
||||
|
||||
SetConsoleFormat(0);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,118 @@
|
|||
static class Task1
|
||||
{
|
||||
public static IEnumerable<float> SequenceSingle()
|
||||
{
|
||||
// n, n-1, and n-2
|
||||
float vn, vn_1, vn_2;
|
||||
vn_2 = 2;
|
||||
vn_1 = -4;
|
||||
|
||||
while (true)
|
||||
{
|
||||
yield return vn_2;
|
||||
vn = 111f - (1130f / vn_1) + (3000f / (vn_1 * vn_2));
|
||||
vn_2 = vn_1;
|
||||
vn_1 = vn;
|
||||
}
|
||||
}
|
||||
|
||||
public static IEnumerable<double> SequenceDouble()
|
||||
{
|
||||
// n, n-1, and n-2
|
||||
double vn, vn_1, vn_2;
|
||||
vn_2 = 2;
|
||||
vn_1 = -4;
|
||||
|
||||
while (true)
|
||||
{
|
||||
yield return vn_2;
|
||||
vn = 111 - (1130 / vn_1) + (3000 / (vn_1 * vn_2));
|
||||
vn_2 = vn_1;
|
||||
vn_1 = vn;
|
||||
}
|
||||
}
|
||||
|
||||
public static IEnumerable<decimal> SequenceDecimal()
|
||||
{
|
||||
// n, n-1, and n-2
|
||||
decimal vn, vn_1, vn_2;
|
||||
vn_2 = 2;
|
||||
vn_1 = -4;
|
||||
|
||||
// Use constants to avoid calling the Decimal constructor in the loop.
|
||||
const decimal i11 = 111;
|
||||
const decimal i130 = 1130;
|
||||
const decimal E000 = 3000;
|
||||
|
||||
while (true)
|
||||
{
|
||||
yield return vn_2;
|
||||
vn = i11 - (i130 / vn_1) + (E000 / (vn_1 * vn_2));
|
||||
vn_2 = vn_1;
|
||||
vn_1 = vn;
|
||||
}
|
||||
}
|
||||
|
||||
#if USE_BIGRATIONAL
|
||||
public static IEnumerable<BigRational> SequenceRational()
|
||||
{
|
||||
// n, n-1, and n-2
|
||||
BigRational vn, vn_1, vn_2;
|
||||
vn_2 = 2;
|
||||
vn_1 = -4;
|
||||
|
||||
// Same reasoning as for decimal.
|
||||
BigRational i11 = 111;
|
||||
BigRational i130 = 1130;
|
||||
BigRational E000 = 3000;
|
||||
|
||||
while (true)
|
||||
{
|
||||
yield return vn_2;
|
||||
vn = i11 - (i130 / vn_1) + (E000 / (vn_1 * vn_2));
|
||||
vn_2 = vn_1;
|
||||
vn_1 = vn;
|
||||
}
|
||||
}
|
||||
#else
|
||||
public static IEnumerable<BigRational> SequenceRational()
|
||||
{
|
||||
while (true) yield return default;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void IncreaseMaxN(ref int[] arr)
|
||||
{
|
||||
int[] tmp = new int[arr.Length + 1];
|
||||
arr.CopyTo(tmp, 0);
|
||||
tmp[arr.Length] = 1000;
|
||||
arr = tmp;
|
||||
}
|
||||
|
||||
public static void WrongConvergence()
|
||||
{
|
||||
Console.WriteLine("Wrong Convergence Sequence:");
|
||||
|
||||
int[] displayedIndices = { 3, 4, 5, 6, 7, 8, 20, 30, 50, 100 };
|
||||
IncreaseMaxN(ref displayedIndices);
|
||||
|
||||
var indicesSet = new HashSet<int>(displayedIndices);
|
||||
|
||||
Console.WriteLine(Headings);
|
||||
|
||||
int n = 1;
|
||||
// Enumerate the implementations in parallel as tuples.
|
||||
foreach (var x in SequenceSingle()
|
||||
.Zip(SequenceDouble(), (sn, db) => (sn, db))
|
||||
.Zip(SequenceDecimal(), (a, dm) => (a.sn, a.db, dm))
|
||||
.Zip(SequenceRational(), (a, br) => (a.sn, a.db, a.dm, br)))
|
||||
{
|
||||
if (n > displayedIndices.Max()) break;
|
||||
|
||||
if (indicesSet.Contains(n))
|
||||
Console.WriteLine(FormatOutput(n, x));
|
||||
|
||||
n++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
static class Task2
|
||||
{
|
||||
public static IEnumerable<float> ChaoticBankSocietySingle()
|
||||
{
|
||||
float balance = (float)(Math.E - 1);
|
||||
|
||||
for (int year = 1; ; year++)
|
||||
yield return balance = (balance * year) - 1;
|
||||
}
|
||||
|
||||
public static IEnumerable<double> ChaoticBankSocietyDouble()
|
||||
{
|
||||
double balance = Math.E - 1;
|
||||
|
||||
for (int year = 1; ; year++)
|
||||
yield return balance = (balance * year) - 1;
|
||||
}
|
||||
|
||||
public static IEnumerable<decimal> ChaoticBankSocietyDecimal()
|
||||
{
|
||||
// 27! is the largest factorial decimal can represent.
|
||||
decimal balance = CalculateEDecimal(27) - 1;
|
||||
|
||||
for (int year = 1; ; year++)
|
||||
yield return balance = (balance * year) - 1;
|
||||
}
|
||||
|
||||
#if USE_BIGRATIONAL
|
||||
public static IEnumerable<BigRational> ChaoticBankSocietyRational()
|
||||
{
|
||||
// 100 iterations is precise enough for 25 years.
|
||||
BigRational brBalance = CalculateERational(100) - 1;
|
||||
|
||||
for (int year = 1; ; year++)
|
||||
yield return brBalance = (brBalance * year) - 1;
|
||||
}
|
||||
#else
|
||||
public static IEnumerable<BigRational> ChaoticBankSocietyRational()
|
||||
{
|
||||
while (true) yield return default;
|
||||
}
|
||||
#endif
|
||||
|
||||
public static decimal CalculateEDecimal(int terms)
|
||||
{
|
||||
decimal e = 1;
|
||||
decimal fact = 1;
|
||||
for (int i = 1; i <= terms; i++)
|
||||
{
|
||||
fact *= i;
|
||||
e += decimal.One / fact;
|
||||
}
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
#if USE_BIGRATIONAL
|
||||
public static BigRational CalculateERational(int terms)
|
||||
{
|
||||
BigRational e = 1;
|
||||
BigRational fact = 1;
|
||||
for (int i = 1; i < terms; i++)
|
||||
{
|
||||
fact *= i;
|
||||
e += BigRational.Invert(fact);
|
||||
}
|
||||
|
||||
return e;
|
||||
}
|
||||
#endif
|
||||
|
||||
[Conditional("INCREASED_LIMITS")]
|
||||
static void InceaseMaxYear(ref int year) => year = 40;
|
||||
|
||||
public static void ChaoticBankSociety()
|
||||
{
|
||||
Console.WriteLine("Chaotic Bank Society:");
|
||||
Console.WriteLine(Headings);
|
||||
|
||||
int maxYear = 25;
|
||||
InceaseMaxYear(ref maxYear);
|
||||
|
||||
int i = 0;
|
||||
foreach (var x in ChaoticBankSocietySingle()
|
||||
.Zip(ChaoticBankSocietyDouble(), (sn, db) => (sn, db))
|
||||
.Zip(ChaoticBankSocietyDecimal(), (a, dm) => (a.sn, a.db, dm))
|
||||
.Zip(ChaoticBankSocietyRational(), (a, br) => (a.sn, a.db, a.dm, br)))
|
||||
{
|
||||
if (i >= maxYear) break;
|
||||
Console.WriteLine(FormatOutput(i + 1, x));
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
static class Task3
|
||||
{
|
||||
public static float SiegfriedRumpSingle(float a, float b)
|
||||
{
|
||||
float
|
||||
a2 = a * a,
|
||||
b2 = b * b,
|
||||
b4 = b2 * b2,
|
||||
b6 = b4 * b2
|
||||
;
|
||||
|
||||
// Non-integral literals must be coerced to single using the type suffix.
|
||||
return 333.75f * b6 +
|
||||
(a2 * (
|
||||
11 * a2 * b2 -
|
||||
b6 -
|
||||
121 * b4 -
|
||||
2)) +
|
||||
5.5f * b4 * b4 +
|
||||
a / (2 * b);
|
||||
}
|
||||
|
||||
public static double SiegfriedRumpDouble(double a, double b)
|
||||
{
|
||||
double
|
||||
a2 = a * a,
|
||||
b2 = b * b,
|
||||
b4 = b2 * b2,
|
||||
b6 = b4 * b2
|
||||
;
|
||||
|
||||
// Non-integral literals are doubles by default.
|
||||
return
|
||||
333.75 * b6
|
||||
+ a2 * (
|
||||
11 * a2 * b * b
|
||||
- b6
|
||||
- 121 * b4
|
||||
- 2)
|
||||
+ 5.5 * b4 * b4
|
||||
+ a / (2 * b);
|
||||
}
|
||||
|
||||
public static decimal SiegfriedRumpDecimal(decimal a, decimal b)
|
||||
{
|
||||
decimal
|
||||
a2 = a * a,
|
||||
b2 = b * b,
|
||||
b4 = b2 * b2,
|
||||
b6 = b4 * b2
|
||||
;
|
||||
|
||||
// The same applies for decimal.
|
||||
return
|
||||
333.75m * b6
|
||||
+ a2 * (
|
||||
11 * a2 * b * b
|
||||
- b6
|
||||
- 121 * b4
|
||||
- 2)
|
||||
+ 5.5m * b4 * b4
|
||||
+ a / (2 * b);
|
||||
}
|
||||
|
||||
#if USE_BIGRATIONAL
|
||||
public static BigRational SiegfriedRumpRational(BigRational a, BigRational b)
|
||||
{
|
||||
// Use mixed number constructor to maintain exact precision (333+3/4, 5+1/2).
|
||||
var c1 = new BigRational(33375, 100);
|
||||
var c2 = new BigRational(55, 10);
|
||||
|
||||
return c1 * BigRational.Pow(b, 6)
|
||||
+ (a * a * (
|
||||
11 * a * a * b * b
|
||||
- BigRational.Pow(b, 6)
|
||||
- 121 * BigRational.Pow(b, 4)
|
||||
- 2))
|
||||
+ c2 * BigRational.Pow(b, 8)
|
||||
+ a / (2 * b);
|
||||
}
|
||||
#else
|
||||
public static IEnumerable<BigRational> SiegfriedRumpRational()
|
||||
{
|
||||
while (true) yield return default;
|
||||
}
|
||||
#endif
|
||||
|
||||
public static void SiegfriedRump()
|
||||
{
|
||||
Console.WriteLine("Siegfried Rump Formula");
|
||||
int a = 77617;
|
||||
int b = 33096;
|
||||
|
||||
Console.Write("Single: ");
|
||||
float sn = SiegfriedRumpSingle(a, b);
|
||||
Console.WriteLine("{0:G9}", sn);
|
||||
Console.WriteLine();
|
||||
|
||||
Console.Write("Double: ");
|
||||
double db = SiegfriedRumpDouble(a, b);
|
||||
Console.WriteLine("{0:G17}", db);
|
||||
Console.WriteLine();
|
||||
|
||||
Console.WriteLine("Decimal:");
|
||||
decimal dm = 0;
|
||||
try
|
||||
{
|
||||
dm = SiegfriedRumpDecimal(a, b);
|
||||
}
|
||||
catch (OverflowException ex)
|
||||
{
|
||||
Console.WriteLine("Exception: " + ex.Message);
|
||||
}
|
||||
Console.WriteLine($" {dm}");
|
||||
Console.WriteLine();
|
||||
|
||||
Console.WriteLine("BigRational:");
|
||||
BigRational br = SiegfriedRumpRational(a, b);
|
||||
Console.WriteLine($" Rounded: {(decimal)br}");
|
||||
Console.WriteLine($" Exact: {br}");
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue