Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
|
|
@ -0,0 +1,54 @@
|
|||
Imports System.Globalization
|
||||
Imports System.Numerics
|
||||
Imports Numerics
|
||||
|
||||
#Const USE_BIGRATIONAL = True
|
||||
#Const BANDED_ROWS = True
|
||||
#Const INCREASED_LIMITS = True
|
||||
|
||||
#If Not USE_BIGRATIONAL Then
|
||||
' Mock structure to make test code work.
|
||||
Structure BigRational
|
||||
Overrides Function ToString() As String
|
||||
Return "NOT USING BIGRATIONAL"
|
||||
End Function
|
||||
Shared Narrowing Operator CType(value As BigRational) As Decimal
|
||||
Return -1
|
||||
End Operator
|
||||
End Structure
|
||||
#End If
|
||||
|
||||
Module Common
|
||||
Public Const FMT_STR = "{0,4} {1,-15:G9} {2,-24:G17} {3,-32} {4,-32}"
|
||||
Public ReadOnly Property Headings As String =
|
||||
String.Format(CultureInfo.InvariantCulture,
|
||||
FMT_STR,
|
||||
{"N", "Single", "Double", "Decimal", "BigRational (rounded as decimal)"})
|
||||
|
||||
<Conditional("BANDED_ROWS")>
|
||||
Sub SetConsoleFormat(n As Integer)
|
||||
If n Mod 2 = 0 Then
|
||||
Console.BackgroundColor = ConsoleColor.Black
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Else
|
||||
Console.BackgroundColor = ConsoleColor.White
|
||||
Console.ForegroundColor = ConsoleColor.Black
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Function FormatOutput(n As Integer, x As (sn As Single, db As Double, dm As Decimal, br As BigRational)) As String
|
||||
SetConsoleFormat(n)
|
||||
Return String.Format(CultureInfo.CurrentCulture, FMT_STR, n, x.sn, x.db, x.dm, CDec(x.br))
|
||||
End Function
|
||||
|
||||
Sub Main()
|
||||
WrongConvergence()
|
||||
Console.WriteLine()
|
||||
ChaoticBankSociety()
|
||||
|
||||
Console.WriteLine()
|
||||
SiegfriedRump()
|
||||
|
||||
SetConsoleFormat(0)
|
||||
End Sub
|
||||
End Module
|
||||
|
|
@ -0,0 +1,107 @@
|
|||
Module Task1
|
||||
Iterator Function SequenceSingle() As IEnumerable(Of Single)
|
||||
' n, n-1, and n-2
|
||||
Dim vn, vn_1, vn_2 As Single
|
||||
vn_2 = 2
|
||||
vn_1 = -4
|
||||
|
||||
Do
|
||||
Yield vn_2
|
||||
vn = 111 - (1130 / vn_1) + (3000 / (vn_1 * vn_2))
|
||||
vn_2 = vn_1
|
||||
vn_1 = vn
|
||||
Loop
|
||||
End Function
|
||||
|
||||
Iterator Function SequenceDouble() As IEnumerable(Of Double)
|
||||
' n, n-1, and n-2
|
||||
Dim vn, vn_1, vn_2 As Double
|
||||
vn_2 = 2
|
||||
vn_1 = -4
|
||||
|
||||
Do
|
||||
Yield vn_2
|
||||
vn = 111 - (1130 / vn_1) + (3000 / (vn_1 * vn_2))
|
||||
vn_2 = vn_1
|
||||
vn_1 = vn
|
||||
Loop
|
||||
End Function
|
||||
|
||||
Iterator Function SequenceDecimal() As IEnumerable(Of Decimal)
|
||||
' n, n-1, and n-2
|
||||
Dim vn, vn_1, vn_2 As Decimal
|
||||
vn_2 = 2
|
||||
vn_1 = -4
|
||||
|
||||
' Use constants to avoid calling the Decimal constructor in the loop.
|
||||
Const i11 As Decimal = 111
|
||||
Const i130 As Decimal = 1130
|
||||
Const E000 As Decimal = 3000
|
||||
|
||||
Do
|
||||
Yield vn_2
|
||||
vn = i11 - (i130 / vn_1) + (E000 / (vn_1 * vn_2))
|
||||
vn_2 = vn_1
|
||||
vn_1 = vn
|
||||
Loop
|
||||
End Function
|
||||
|
||||
#If USE_BIGRATIONAL Then
|
||||
Iterator Function SequenceRational() As IEnumerable(Of BigRational)
|
||||
' n, n-1, and n-2
|
||||
Dim vn, vn_1, vn_2 As BigRational
|
||||
vn_2 = 2
|
||||
vn_1 = -4
|
||||
|
||||
' Same reasoning as for Decimal.
|
||||
Dim i11 As BigRational = 111
|
||||
Dim i130 As BigRational = 1130
|
||||
Dim E000 As BigRational = 3000
|
||||
|
||||
Do
|
||||
Yield vn_2
|
||||
vn = i11 - (i130 / vn_1) + (E000 / (vn_1 * vn_2))
|
||||
vn_2 = vn_1
|
||||
vn_1 = vn
|
||||
Loop
|
||||
End Function
|
||||
#Else
|
||||
Iterator Function SequenceRational() As IEnumerable(Of BigRational)
|
||||
Do
|
||||
Yield Nothing
|
||||
Loop
|
||||
End Function
|
||||
#End If
|
||||
|
||||
<Conditional("INCREASED_LIMITS")>
|
||||
Sub IncreaseMaxN(ByRef arr As Integer())
|
||||
ReDim Preserve arr(arr.Length)
|
||||
arr(arr.Length - 1) = 1000
|
||||
End Sub
|
||||
|
||||
Sub WrongConvergence()
|
||||
Console.WriteLine("Wrong Convergence Sequence:")
|
||||
|
||||
Dim displayedIndices As Integer() = {3, 4, 5, 6, 7, 8, 20, 30, 50, 100}
|
||||
IncreaseMaxN(displayedIndices)
|
||||
|
||||
Dim indicesSet As New HashSet(Of Integer)(displayedIndices)
|
||||
|
||||
Console.WriteLine(Headings)
|
||||
|
||||
Dim n As Integer = 1
|
||||
' Enumerate the implementations in parallel as tuples.
|
||||
For Each x In SequenceSingle().
|
||||
Zip(SequenceDouble(), Function(sn, db) (sn, db)).
|
||||
Zip(SequenceDecimal(), Function(a, dm) (a.sn, a.db, dm)).
|
||||
Zip(SequenceRational(), Function(a, br) (a.sn, a.db, a.dm, br))
|
||||
If n > displayedIndices.Max() Then Exit For
|
||||
|
||||
If indicesSet.Contains(n) Then
|
||||
Console.WriteLine(FormatOutput(n, x))
|
||||
End If
|
||||
|
||||
n += 1
|
||||
Next
|
||||
End Sub
|
||||
End Module
|
||||
|
|
@ -0,0 +1,103 @@
|
|||
Module Task2
|
||||
Iterator Function ChaoticBankSocietySingle() As IEnumerable(Of Single)
|
||||
Dim balance As Single = Math.E - 1
|
||||
Dim year As Integer = 1
|
||||
|
||||
Do
|
||||
balance = (balance * year) - 1
|
||||
Yield balance
|
||||
year += 1
|
||||
Loop
|
||||
End Function
|
||||
Iterator Function ChaoticBankSocietyDouble() As IEnumerable(Of Double)
|
||||
Dim balance As Double = Math.E - 1
|
||||
Dim year As Integer = 1
|
||||
|
||||
Do
|
||||
balance = (balance * year) - 1
|
||||
Yield balance
|
||||
year += 1
|
||||
Loop
|
||||
End Function
|
||||
|
||||
Iterator Function ChaoticBankSocietyDecimal() As IEnumerable(Of Decimal)
|
||||
' 27! is the largest factorial decimal can represent.
|
||||
Dim balance As Decimal = CalculateEDecimal(27) - Decimal.One
|
||||
Dim year As Integer = 1
|
||||
|
||||
Do
|
||||
balance = (balance * year) - Decimal.One
|
||||
Yield balance
|
||||
year += 1
|
||||
Loop
|
||||
End Function
|
||||
|
||||
#If USE_BIGRATIONAL Then
|
||||
Iterator Function ChaoticBankSocietyRational() As IEnumerable(Of BigRational)
|
||||
' 100 iterations is precise enough for 25 years.
|
||||
Dim balance As BigRational = CalculateEBigRational(100) - BigRational.One
|
||||
Dim year As Integer = 1
|
||||
|
||||
Do
|
||||
balance = (balance * year) - BigRational.One
|
||||
Yield balance
|
||||
year += 1
|
||||
Loop
|
||||
End Function
|
||||
#Else
|
||||
Iterator Function ChaoticBankSocietyRational() As IEnumerable(Of BigRational)
|
||||
Do
|
||||
Yield Nothing
|
||||
Loop
|
||||
End Function
|
||||
#End If
|
||||
|
||||
Function CalculateEDecimal(terms As Integer) As Decimal
|
||||
Dim e As Decimal = 1
|
||||
Dim fact As Decimal = 1
|
||||
|
||||
For i As Integer = 1 To terms
|
||||
fact *= i
|
||||
e += Decimal.One / fact
|
||||
Next
|
||||
|
||||
Return e
|
||||
End Function
|
||||
|
||||
#If USE_BIGRATIONAL Then
|
||||
Function CalculateEBigRational(terms As Integer) As BigRational
|
||||
Dim e As BigRational = 1
|
||||
Dim fact As BigInteger = 1
|
||||
|
||||
For i As Integer = 1 To terms
|
||||
fact *= i
|
||||
e += BigRational.Invert(fact)
|
||||
Next
|
||||
|
||||
Return e
|
||||
End Function
|
||||
#End If
|
||||
|
||||
<Conditional("INCREASED_LIMITS")>
|
||||
Sub IncreaseMaxYear(ByRef year As Integer)
|
||||
year = 40
|
||||
End Sub
|
||||
|
||||
Sub ChaoticBankSociety()
|
||||
Console.WriteLine("Chaotic Bank Society:")
|
||||
Console.WriteLine(Headings)
|
||||
|
||||
Dim maxYear As Integer = 25
|
||||
IncreaseMaxYear(maxYear)
|
||||
|
||||
Dim i As Integer = 0
|
||||
For Each x In ChaoticBankSocietySingle().
|
||||
Zip(ChaoticBankSocietyDouble(), Function(sn, db) (sn, db)).
|
||||
Zip(ChaoticBankSocietyDecimal(), Function(a, dm) (a.sn, a.db, dm)).
|
||||
Zip(ChaoticBankSocietyRational(), Function(a, br) (a.sn, a.db, a.dm, br))
|
||||
If i >= maxYear Then Exit For
|
||||
Console.WriteLine(FormatOutput(i + 1, x))
|
||||
i += 1
|
||||
Next
|
||||
End Sub
|
||||
End Module
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
Module Task3
|
||||
Function SiegfriedRumpSingle(a As Single, b As Single) As Single
|
||||
Dim 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)
|
||||
End Function
|
||||
|
||||
Function SiegfriedRumpDouble(a As Double, b As Double) As Double
|
||||
Dim 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 * b2 -
|
||||
b6 -
|
||||
121 * b4 -
|
||||
2)) +
|
||||
5.5 * b4 * b4 +
|
||||
a / (2 * b)
|
||||
End Function
|
||||
|
||||
Function SiegfriedRumpDecimal(a As Decimal, b As Decimal) As Decimal
|
||||
Dim a2 = a * a,
|
||||
b2 = b * b,
|
||||
b4 = b2 * b2,
|
||||
b6 = b4 * b2
|
||||
|
||||
' The same applies for Decimal.
|
||||
Return 333.75D * b6 +
|
||||
(a2 * (
|
||||
11 * a2 * b2 -
|
||||
b6 -
|
||||
121 * b4 -
|
||||
2)) +
|
||||
5.5D * b4 * b4 +
|
||||
a / (2 * b)
|
||||
End Function
|
||||
|
||||
#If USE_BIGRATIONAL Then
|
||||
Function SiegfriedRumpRational(a As BigRational, b As BigRational) As BigRational
|
||||
' Use mixed number constructor to maintain exact precision (333+3/4, 5+1/2).
|
||||
Dim c1 As New BigRational(333, 3, 4)
|
||||
Dim c2 As New BigRational(5, 1, 2)
|
||||
|
||||
Dim a2 = a * a,
|
||||
b2 = b * b,
|
||||
b4 = b2 * b2,
|
||||
b6 = b4 * b2
|
||||
|
||||
Return c1 * b6 +
|
||||
(a2 * (
|
||||
11 * a2 * b2 -
|
||||
b6 -
|
||||
121 * b4 -
|
||||
2)) +
|
||||
c2 * b4 * b4 +
|
||||
a / (2 * b)
|
||||
End Function
|
||||
#Else
|
||||
Function SiegfriedRumpRational(a As Integer, b As Integer) As BigRational
|
||||
Return Nothing
|
||||
End Function
|
||||
#End If
|
||||
|
||||
Sub SiegfriedRump()
|
||||
Console.WriteLine("Siegfried Rump Formula:")
|
||||
Dim a As Integer = 77617
|
||||
Dim b As Integer = 33096
|
||||
|
||||
Console.Write("Single: ")
|
||||
Dim sn As Single = SiegfriedRumpSingle(a, b)
|
||||
Console.WriteLine("{0:G9}", sn)
|
||||
Console.WriteLine()
|
||||
|
||||
Console.Write("Double: ")
|
||||
Dim db As Double = SiegfriedRumpDouble(a, b)
|
||||
Console.WriteLine("{0:G17}", db)
|
||||
Console.WriteLine()
|
||||
|
||||
Console.WriteLine("Decimal:")
|
||||
Dim dm As Decimal
|
||||
Try
|
||||
dm = SiegfriedRumpDecimal(a, b)
|
||||
Catch ex As OverflowException
|
||||
Console.WriteLine("Exception: " + ex.Message)
|
||||
End Try
|
||||
Console.WriteLine($" {dm}")
|
||||
Console.WriteLine()
|
||||
|
||||
Console.WriteLine("BigRational:")
|
||||
Dim br As BigRational = SiegfriedRumpRational(a, b)
|
||||
Console.WriteLine($" Rounded: {CDec(br)}")
|
||||
Console.WriteLine($" Exact: {br}")
|
||||
End Sub
|
||||
End Module
|
||||
Loading…
Add table
Add a link
Reference in a new issue