Kom ihåg mig?
Home Menu

Menu


Faktorisering av PI

Ämnesverktyg Visningsalternativ
Oläst 2013-01-06, 09:51 #1
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Standard Faktorisering av PI

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();
		}

	}
}

Senast redigerad av Conny Westh den 2013-01-06 klockan 10:06
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 06:27.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017