Detta faller under kategorin värdelöst vetande så om du vill använda din tid till vettiga saker så kan du sluta läsa här och gå och gör något annat i stället.
Drömde om PI, vaknade mitt i natten och hjärnan malde på som den värsta kompilator och hade därmed lite svårt att somna så jag satte mig framför datorn för att hitta ett sätt att göra en aproximativ factorisering av PI. Efter några timmars knackande på tangentbordet blev resultatet bifogat program i C#.
Kod:
////////////////////////////////////////////////////////////////////////////////
// File: FactorizePI.cs
// Author: Conny Westh, [email protected]
// Date Created: 2013-01-06, January 6, 2013
////////////////////////////////////////////////////////////////////////////////
// Purpose: Make aproximate factorization of Math.PI in C#.
// Constant value of Math.PI => 3,14159265358979
// When first aproximation is 3/1 and after 177 improvements
// the best fit factors (245 850 922 / 78 256 779) was found after about
// 156 513 560 analytical iterations, with 15 significant digits (14 decimals).
////////////////////////////////////////////////////////////////////////////////
using System;
namespace CustomValueTypes
{
public struct FactorizePI
{
public double Numerator;
public double Denominator;
public double PI
{
get
{
return this.Numerator / this.Denominator;
}
}
public double Diff
{
get
{
double _diff = Math.PI - this.PI;
if (_diff < 0)
{
return -_diff;
}
else
{
return _diff;
}
}
}
public FactorizePI(double Numerator, double Denominator)
{
this.Numerator = Numerator;
this.Denominator = Denominator;
}
public FactorizePI(FactorizePI factor)
{
this.Numerator = factor.Numerator;
this.Denominator = factor.Denominator;
}
public override string ToString()
{
return String.Format("{0}, {1}/{2}, diff => {3}", this.PI, this.Numerator, this.Denominator, this.Diff);
}
public static void Test()
{
FactorizePI current = new FactorizePI(3, 1);
FactorizePI best = new FactorizePI(current);
ulong testCount = 0L;
int improvement = 0;
double highNumerator = best.Denominator * 3 + 1;
double lowNumerator = best.Denominator * 3;
Console.WriteLine("-------------------------------------------------------------------------------");
Console.WriteLine("Aproximative factorization of PI with Math.PI ({0}) constant in C#", Math.PI);
Console.WriteLine("-------------------------------------------------------------------------------");
for (current.Denominator = 1; current.Denominator <= 100000000; current.Denominator++)
{
lowNumerator = Math.Round(current.Denominator * best.PI - best.Diff * best.PI, 0);
if (lowNumerator < 3) lowNumerator = 3;
highNumerator = Math.Round(current.Denominator * best.PI + best.Diff * best.PI+1, 0);
for (current.Numerator = lowNumerator; current.Numerator <= highNumerator; current.Numerator++)
{
testCount+=1L;
if (current.Diff < best.Diff)
{
// Bättre
improvement++;
best = current;
Console.WriteLine("---> Bättre[{0}][{1}]: {2}", testCount, improvement, best);
}
}
}
Console.WriteLine("-------------------------------------------------------------------------------");
Console.WriteLine("---> Bästa[{0}][{1}]: {2}", testCount, improvement, best);
Console.WriteLine("---> Den inbyggda konstanten Math.PI: {0}", Math.PI);
Console.WriteLine("---> Total number of tests performed: {0}", testCount);
Console.WriteLine("-------------------------------------------------------------------------------");
}
}
}
Kod:
////////////////////////////////////////////////////////////////////////////////
// File: Program.cs
// Author: Conny Westh, [email protected]
// Date Created: 2013-01-06, January 6, 2013
////////////////////////////////////////////////////////////////////////////////
// Purpose: Call of FactorizePI.Test()
////////////////////////////////////////////////////////////////////////////////
using System;
namespace CustomValueTypes
{
class Program
{
static void Main(string[] args)
{
FactorizePI.Test();
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
}
}