Výpočet pí - chybička? – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Výpočet pí - chybička? – .NET – Fórum – Programujte.comVýpočet pí - chybička? – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Matěj Andrle+1
Grafoman
24. 6. 2014   #1
-
0
-

Dobrý den,
na základě mnoha hodin studování všech možných vzorců aplikovaných v C# jsem vyplodil toto: 

public static class PiAlgorithm
{
	public static string Calculate(int digits, int iterations)
	{
		return
		(
			16 * ArcTan1OverX(5, digits).ElementAt(iterations)
			-
			4 * ArcTan1OverX(239, digits).ElementAt(iterations)
		).ToString();
	}
	
	//arctan(x) = x - x^3/3 + x^5/5 - x^7/7 + x^9/9 - ...
	static IEnumerable<BigInteger> ArcTan1OverX(int x, int digits)
	{
		BigInteger

			mag = BigInteger.Pow(10, digits),
			sum = BigInteger.Zero;

		for(int exponent = 1; true; exponent += 2)
			yield return sum -= mag / -(BigInteger.Pow(x, exponent) * exponent);
	}
}


Jenže jaksi se to ani neblíží číslu pí a navíc - když posunu začátek, vychází totéž. Je to vzorcem, anebo jsem udělal chybu já? (Jakou?)
Děkuji.

Nahlásit jako SPAM
IP: 78.136.136.–
p3can
~ Anonymní uživatel
312 příspěvků
24. 6. 2014   #2
-
0
-

je treba to PI skutecne pocitat ? navic operace s BigInt jsou neuveritelne pomale. pokud vim textovy soubor obsahujici 1M platnych cislic PI zabira 1mb. neni lepsi si to predpocitat a do aplikace pouze nacitat toto cislo ze souboru ?

Nahlásit jako SPAM
IP: 77.92.213.–
Matěj Andrle+1
Grafoman
24. 6. 2014   #3
-
0
-

Jen si hraji - kdo si hraje, ten nezlobí! :D Jen bych si chtěl hrát "správně". Navíc - jak chceš převádět tak velké číslo na datový typ číslo, který potřebuji?

Nahlásit jako SPAM
IP: 78.136.136.–
p3can
~ Anonymní uživatel
312 příspěvků
24. 6. 2014   #4
-
0
-

mozna kdybys napsal kontext v jake to chces pouzit, kolik mist potrebujes. navic podle originalu nahore si vracis cislo ve stringu tak proc tady pises ze chces datovy typ cislo ?

Nahlásit jako SPAM
IP: 77.92.213.–
Matěj Andrle+1
Grafoman
24. 6. 2014   #5
-
0
-

To jen proto, abych mohl snáze testovat zada to funguje. A jak píši - moc dobře ne. Copak záleží na kontextu? Když už nic jiného, chci se naučit správný a funkční vzorec. Neb abych později nešířil bludy...

Nahlásit jako SPAM
IP: 78.136.136.–
p3can
~ Anonymní uživatel
312 příspěvků
24. 6. 2014   #6
-
0
-

achjo. ano zalezi na kontextu. vzdycky zalezi na kontextu. delas program na pocitani 2D objektu a jejich obsahu ? staci pouzit Math.PI. delas program na zatez cpu ? nebo co delas ?

BigInt je pomaly. IEnumerable je pouzito velmi nevhodne. Spolu s volanim ElementAt je to absolutne smrtici algoritmus (at uz funguje nebo ne).

Nahlásit jako SPAM
IP: 77.92.213.–
Matěj Andrle+1
Grafoman
24. 6. 2014   #7
-
0
-

Jak už jsem napsal. Potřebuji po kusech číst pí a porovnávat tyto kusy s jinými čísly. Mohu to dát do textu a porovnávat texty - jen jsem chtěl zkusit vyvořit vzorec...

Nahlásit jako SPAM
IP: 78.136.136.–
p3can
~ Anonymní uživatel
312 příspěvků
24. 6. 2014   #8
-
0
-

s konkretnim algoritmem jak pocitat pi ti neporadim, ale urcite se vyhni IEnumerable, yield a ElementAt (aspon tak jak to mas napsane ted). je to neuveritelne neefektivni a pomale. taky opatrne s tim bigintem operace snim jsou taky velice pomale.
 

Nahlásit jako SPAM
IP: 77.92.213.–
Řešení
miminko
~ Anonymní uživatel
1 příspěvek
24. 6. 2014   #9
-
+1
-
Zajímavé
Kit +
Vyřešeno Nejlepší odpověď

Ahoj,

ja si naopak myslim ze IEnumerable muze byt velmi vhodna a primo na to delana:)

Jestli Ti rozumim, tak jen tak blbnes a pocitas PI. Ja mam tuseni, ze PI je nekonecny, takze jestli chces terba nekde na nejakym ui zobrazovat nekonecny text s PI, enumerable je super volba. Naopak jestli chces cokoliv pocitat, nikdy v zivote se Ti nevyplati jakakoliv Tvoje funkce, co vypocita PI, vzdycky musis pocitat s konstantou.

Kazdopadne pro nekonecne PI, by ti mela stacit tato enumerable:

IEnumerable<char> InfinityPI()

{

  // tady postupne pocitat PI a vracet neco jako:  "3", ",", "1", .........

}

Pak ani nepotrebujes funkcni Calculate, protoze staci iterovat tou InfinityPI kolikrat chces :) bud jednou, nebo donekonecna.

Kazdopadne IEnumerable.ElementAt, je dobry sluha, ale musi se premejslet kdy a zda to pouzit. Funguje tak, ze pro ElementAt(1000) se prochazi dana kolekce objekt po objektu, dokovad se nenajde objekt na pozadovanem indexu - ne vzdy tomu tak je, ale  V tom Tvem pripade je to zrovna skutecne smrtici.

Nahlásit jako SPAM
IP: 77.240.99.–
peter
~ Anonymní uživatel
3985 příspěvků
25. 6. 2014   #10
-
0
-
Nahlásit jako SPAM
IP: 2001:718:2601:258:a94f:12...–
peter
~ Anonymní uživatel
3985 příspěvků
27. 6. 2014   #11
-
0
-
Nahlásit jako SPAM
IP: 2001:718:2601:258:6928:dd...–
Matěj Andrle+1
Grafoman
27. 6. 2014   #12
-
0
-

Celé jsem to skoro opravil:

// 10^11 seems to be the maximum too high a figure for the base introduces errors
Base = Math.pow(10, 11); 
// num digits in each array item
CellSize = Math.floor(Math.log(Base) / Math.LN10);	 
MaxDiv = Math.floor(Math.sqrt(Number.MAX_VALUE));

function MakeArray(n, aX, Integer)
{
	for(i = 1; i < n; i++) 
		aX[i] = null;

	aX[0] = Integer;
}

function IsEmpty(aX)
{
	for(i = 0; i < aX.length; i++)	
		if(aX[i])return = false;

	return true;
}

function Add(n, aX,aY)
{
	carry = 0;

	for(i = n - 1; i >= 0; i--)
	{
		aX[i] += Number(aY[i]) + Number(carry);

		if(aX[i] < Base) 
			carry = 0;
		else
		{
			carry = 1;
			aX[i] =Number(aX[i]) - Number(Base);
		}
	}
}

function Subtract(n, aX,aY)
{
	for(i = n - 1; i >= 0; i--)
	{
		aX[i] -= aY[i];

		if(aX[i] < 0 && i > 0)
		{	
			aX[i] += Base;
			aX[i - 1]--;
		}
	}
}

function Multiply(n, aX, iMultiplyt)
{
	carry = 0;

	for(i = n - 1; i >= 0; i--)
	{
		prod	= aX[i] * iMultiplyt + carry;

		if (prod >= Base)
		{
			carry = Math.floor(prod / Base);
			prod -= (carry * Base);
		}
		else 
			carry = 0;

		aX[i] = prod;
	}	
}

function Divide(n, aX, iDiv, aY)
{
	carry = 0;

	for (i = 0; i < n; i++)
	{
		// add any previous carry
		currVal = Number(aX[i]) + Number(carry * Base);

		theDiv = Math.floor(currVal / iDiv);
		// find next carry
		carry = currVal - theDiv * iDiv;	
		// put the result of division in the current slot 
		aY[i]	= theDiv;
	}	
}

function Arctan(iAng, n, aX)
{
	iAng_squared = iAng * iAng;
	k = 3; // k is the coefficienticient in the series 2n-1, 3,5..

	MakeArray(n, aX, 0); // aX is aArctan
	MakeArray(n, aAngle, 1);	

	Divide(n, aAngle, iAng, aAngle); // aAngle = 1/iAng, eg 1/5
	Add(n, aX, aAngle); // aX = aAngle or long angle

	for(sign = false; !IsEmpty(aAngle); sign = !sign)
	{
		Divide(n, aAngle, iAng_squared, aAngle); // aAngle=aAngle/iAng_squared, iAng_squared is iAng*iAng
		Divide(n, aAngle, k, aDivK); // aDivK = aAngle/k

		if(sign) 
			Add(n, aX, aDivK); // aX = aX+aDivK
		else
			Subtract(n, aX, aDivK); // aX = aX-aDivK

		k += 2;
	}
}

function CalculatePi(numDec)
{
	numDec += 5;
	iAng = new Array(10);
	coefficient = new Array(10);
	arrayLength = Math.ceil(1 + numDec / CellSize);
	aPi = new Array(arrayLength);
	aArctan = new Array(arrayLength);
	aAngle = new Array(arrayLength);
	aDivK = new Array(arrayLength);

	MakeArray(arrayLength, aPi, 0);
	MakeArray(arrayLength, aAngle, 0);
	MakeArray(arrayLength, aDivK, 0);

	// Pi/4 = 4*Arctan(1/5)-Arctan(1/239)
	// the last item is 0!
	coefficient[0] = 4; 
	coefficient[1] = -1;	
	coefficient[2] = 0;
	// iAng holds the angles, 5 for 1/5, etc
	iAng[0] = 5; 
	iAng[1] = 239; 
	iAng[2] = 0;

	for(i = 0; coefficient[i] != 0; i++)
	{
		Arctan(iAng[i], arrayLength, aArctan);

		Multiply(arrayLength, aArctan, Math.abs(coefficient[i]));

		if(coefficient[i] > 0) 
			Add(arrayLength, aPi, aArctan);	
		else		
			Subtract(arrayLength, aPi, aArctan);
	}
	// we have calculated Pi/4, so need to finally Multiplytiply
	Multiply(arrayLength, aPi, 4);

	output = "";

	for(i = 0; i <= numDec; i++)
		output += String(aPi[i]).charAt(i);

	return output;
}


Abych zjistil, že to dělá co mých 5 řádků? Ne - opravdu mi nenacpeš, že tahle spatlanina v JS je lepší, než můj postup... Nehledě na fakt, jak špatně je ten kód napsaný, i sebelepší kód v JS by se C# nevyrovnal... (Už jen proto, že má .NET CIL, zásobu optimalizovaných knihoven,...)

Jak se vůbec můžete ohánět výkonem, efektivitou atp. Když mi radíte daleko horší postupy? :D

Nahlásit jako SPAM
IP: 78.136.175.–
peter
~ Anonymní uživatel
3985 příspěvků
27. 6. 2014   #13
-
0
-

To byl jen takovy tip. Efektivitu jsem neresil. V JS je vsechno pomale :)

Nahlásit jako SPAM
IP: 2001:718:2601:258:6928:dd...–
Matěj Andrle+1
Grafoman
27. 6. 2014   #14
-
0
-

#13 peter
Prohlédni si původní kód. To co jsem z toho dokázal udělat je zázrak! :D C# je plnohodnotný jazyk a skvěle optimalizovaný,... Pročež nevidím důvod používat jiný jazyk. Stačil by správný vzorec - kterýžto jsem se nakonec dozvěděl z onoho JS (přecijen je tam jedna věc jinak), načež mi to šlape dokonale. Na iteraci jsem se vykašlal, poněvadž mi neumožňuje sekvenční výpočet. Místo toho jsem se vrhl na posloupnosti...

Nahlásit jako SPAM
IP: 78.136.175.–
p3can
~ Anonymní uživatel
312 příspěvků
27. 6. 2014   #15
-
0
-

#14 Matěj Andrle
no tak to si trosku mimo :). Jako tezky .NET zavislak ti rikam ze .NET urcite neni nejrychlejsi :). Vzdy se vyplati narocne operace implementovat v C++ a tuto funkci si naimportovat do C# pres p/invoke a volat to takto. Zvlaste pokud se jedna o matematicke/maticove operace tak .NET nemuze souperit s C++ zvlaste pokud vyuzijes pri vyvoji specializovane knihovny jako napr. Intel MKL.

Nahlásit jako SPAM
IP: 77.92.213.–
Matěj Andrle+1
Grafoman
27. 6. 2014   #16
-
0
-

#15 p3can
To nejsi moc zkušený... O rychlost už dávno nejde. Nikdo neřeší rychlost programu, avšak jeho bezpečnost, optimalizaci atd. .NET je pomalý stroj pro OOP. Ovšem právě díky tomu je výkonější než C++! Poněvadž jak jsem psal - nejde o rychlost programu... Ta je ti ve virtuálním prostředí na 2 věci. ASM je běhově rychlejší než-li C++, avšak optimalizace atd. prováděná člověkem snižuje efektivitu, výkonnost.... výsledné aplikace na mizerné hodnoty. Poněvadž člověk nedokáže optimalizovat tak dobře jako stroj sám! Proto ani C++ programátor nemůže udělat tak dobře optimalizovaný program jako vyšší jazyk... Nejlépe jsou na tom dotazovací jazyky! Pročež jak píši - rychlost běhu aplikace je v nižším jazyku vyšší, jenže jeho výkonnnost, efektivita atd. se se strojovým zpracováním nedá srovnat. Běhově pomalejší C# poskytne výpočtu mnohem více paměti a ušetří na efektivným manipulování s alokací atd. (Cokoliv co musí C++ programátor řešit ručně se virtuálnímu stroji nedostane ani k patám.) Rychlost aplikace nemá smysl řešit už jem pro obrovské technologické napdbytky. Vždyť se ani nedá využít dnešní výkon PC!

Kdyby jsi měl pravdu ty, všichni používají RTOS!

Nahlásit jako SPAM
IP: 78.136.175.–
p3can
~ Anonymní uživatel
312 příspěvků
27. 6. 2014   #17
-
0
-

Nikdo neřeší rychlost programu, avšak jeho bezpečnost, optimalizaci

jaky ze je rozdil mezi rychlosti a optimalizaci ? xD

.NET neni rychlejsi nez C++. pokud delas podnikovy IS tak je ti jedno jak nebo na cem to bezi. pokud pises svuj vlastni "matlab" nebo prevadec videa tak uz ti to jedno neni. Operace s maticemi jsou nasobne rychlejsi v C++ nez v .NET (a to i nez unsafe) a pri zracovani obrazu/zvuku a dalsi jsou tyto vlastnosti jaksi dulezitejsi nez to jestli je kod krasny :).

ale neplest si to s tim ze na 90% aplikaci je skutecne java/.net nejlepsi moznou volbou protoze jsou "pohodlnejsi/lepsi".

Nahlásit jako SPAM
IP: 77.92.213.–
Matěj Andrle+1
Grafoman
27. 6. 2014   #18
-
-1
-
Mimo téma

Tak znovu. Rychlost běhu aplikace je vyšší. Optimalizace prováděná člověkem je však daleko horší! Kdyby jsi měl pravdu ty, RTOS by neumíraly, avšak vzkvétaly, protože by se na nich skvěle hrály hry atd. Jenže nehrají. Protože strojová optimalizace programu vyhrává nad tou lidskou... V čím abstraktnějším jazyce program napíšeš, tím více je optimalizován - tím lépe pod strojem jede. Jinak by C# programátor nebral 6x více, než ASM/C/C++... (Tedy krom pár výjimek.)

Nahlásit jako SPAM
IP: 78.136.175.–
p3can
~ Anonymní uživatel
312 příspěvků
27. 6. 2014   #19
-
+1
-
Zajímavé

#18 Matěj Andrle
proc pletes RTOS coz je real time operacni system do toho ze jazyk c++ je rychlejsi nez c# hlavne v oblasti zpracovani zvuku a videa? nehlede na to ze hry pouzivaji enginy v c++. tady nejde o zadnou optimalizaci ale o holy fakt ze c++ ma proste praci s polemi rychlejsi nez C# praktycky vzdy.

Nahlásit jako SPAM
IP: 77.92.213.–
Matěj Andrle+1
Grafoman
27. 6. 2014   #20
-
0
-

Protože v PTOS je již virtualizace! Tudíž i to tvé slavné C++ jede virtuálně! Poněvadž chráněný režim neumožňuje přímý přístup k HW...

Nahlásit jako SPAM
IP: 78.136.175.–
p3can
~ Anonymní uživatel
312 příspěvků
27. 6. 2014   #21
-
+1
-
Zajímavé

co ma spolecneho operacni system a jazyk ve kterem je vytvorena nejaka aplikace? v c# se pouziva overovani hranic pole pri kazdem pristupu narozdil od c++ ktere neoveruje hranice pole. uplne kazdy vi ze c++ je rychlejsi pro praci s poli.

Nahlásit jako SPAM
IP: 77.92.213.–
Satik0
Stálý člen
27. 6. 2014   #22
-
0
-

#18 Matěj Andrle
Kdyby byl C# rychlejší než C++, proč by se někdo namáhal v C++ programovat, když je to mnohem méně pohodlné? :)

A co třeba pokročilé instrukce - ty v C# používat nemůžeš, k čemu by je vývojáři HW do CPU přidávali, když by nebyly potřeba? :)

Nahlásit jako SPAM
IP: 77.87.240.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 28 hostů

Podobná vlákna

Chybička — založil Martin

Vypocet pi — založil Nemo_001

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý