Taskulaskimet tulostavat kertoman (kts. wikipedia) usein pelkästään lukuun 69 asti, koska tuloksessa ei voi olla enempää kuin 99 nollaa. Äärevät luvut ovat siis laskimille pulma, mutta ongelman voi kiertää kun avuksi ottaa ohjelman jossa luku on purettu alkutekijöihinsä eli mantissaan ja exponenttiin. Mantissa tarkoittaa luvun ensimmäisiä desimaaleja, exponentti sitä kuinka monta kertaa se pitää kertoa kymmenellä.
Em. idea c-kielellä toteutettuna näyttää tältä:
//kertoma.c: kertoma suuresta luvusta iteraatiomenetelmällä toteutettuna.
#include
double purku(double ,long int * e);//paluuarvot: mantissa(float) ja exponentti(int*)
struct liuku { //desimaalilukuja alkutekijöissään
double m; //koko 8 tavua
unsigned long int e; //koko 4 tavua
}x,y;
int main(int argc, char *argv[]) //luetaan luku komentoriviltä
{
int b=atoi(argv[1]); //muutetaan luku merkkijonosta kokonaisluvuksi
if (argc!=2){return 1;} //virhetilanteen hallinta
double a=1;
x.m=1;x.e=0; //kertoman siemenluku
for(a=1;a=10){
x.m=x.m/10;
x.e ;
}
}
a--;
printf("Luvun %g kertoma on %8.7g E%u\n",a,x.m,x.e);
return 0;
}
double purku(double a, long int * pe) //puretaan desimaaliluku alkutekijöihinsä
{
long int e=0;
if(a>1){
while(a>1){a=a/10;e ;}
}
if(a
Kertoman laskeminen
3
2295
Vastaukset
Edellä mainittu ohjelma laskee kertoman vain likimäärin mutta tämä laskee sen absoluuttisen tarkasti. Ohjelma perustuu binäärikoodattuun desimaalilukuun (bdc) jolla kierretään muutujan kokorajoitukset. Se miten suuresta luvusta voi kertoman ottaa riippuu taulukkomuuttujan ak[] koosta kun koko on 1000 alkiota voidaan ottaa kertoma luvusta 470.
//kertoma3.c: Absoluuttisen tarkka kertoman laskenta äärevästä luvusta.
#include
char ak[1000]={0}; //bdc_luku (kokonaisluku)
void kertoma(int n);
void kerto(int n); //bdc_kertolasku
void tulostus(void); //
int main()
{
int n=470;
kertoma(n);
printf("%i! = ",n);tulostus();printf("\n");
return 0;
}
void kertoma(int n)
{
int i=1;
ak[999]=1; //kertoman siemenluku
for(i=1;i=0;i--){
yli=(ak[i]*n yli)/10;
ak[i]=(ak[i]*n m)%10;
m=yli;
}
}
void tulostus()
{
int i=0,j=0, rp=0;
for(i=0;i- koodiApina
code.c: In function 'main':
code.c:11: error: parameter 'n' is initialized
code.c:12: error: expected declaration specifiers before 'kertoma'
code.c:13: error: expected declaration specifiers before 'printf'
code.c:13: error: expected declaration specifiers before 'tulostus'
code.c:13: error: expected declaration specifiers before 'printf'
code.c:14: error: expected declaration specifiers before 'return'
code.c:18: error: parameter 'i' is initialized
code.c:19: error: expected declaration specifiers before 'ak'
code.c:20: error: expected declaration specifiers before 'for'
code.c:20: error: expected declaration specifiers before 'i'
code.c:20: error: expected declaration specifiers before 'i'
code.c:18: error: declaration for parameter 'i' but no such parameter
code.c:16: error: declaration for parameter 'kertoma' but no such parameter
code.c:11: error: declaration for parameter 'n' but no such parameter
- GMP-fani
GMP:llä helpommin. http://www.cs.colorado.edu/~srirams/classes/doku.php/gmp_usage_tutorial . En tiedä, miten tuo käsittelee ylivuototilanteet.
Ketjusta on poistettu 1 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
SDP jo 100 % suositumpi kuin persut
Kertoo Hesarin uusin kannatuskysely. Demareiden kannatus on miltei tuplat verrattuna persuihinl. Suomen kansa ei selväst234882- 2144368
SDP haluaa 40 000 nettomaahanmuuttajaa
SDP:n Suunnanmuutos-vaihtoehtobudjetissa, käy ilmi, että demarit itse asiassa vaativat räjähdysmäistä ”työperäisen” maah1473837Orpo: Velkajarrua vastustavaa puoluetta vaikea ajatella hallitukseen
No Minja Koskelan kommunistipuolue jäi ulos tuosta. Kaikki eduskuntapuolueet vasemmistoliittoa lukuun ottamatta sopivat1413308Mikä tämä henkilö mahtaa touhuta Parkanossa
Kamalaa https://www.ylasatakunta.fi/teksti/pirkanmaan-karajaoikeus-vangitsi-koiran-tappamisesta-epaillyn-6.68.127794.b58361828Hienoa! Eduskunta luopui käteisen käytöstä
Nyt tuo sama muutos pitää saada myös muuhun yhteiskuntaan. Käteistähän ei tarvitse tänä päivänä enää kuin rikolliset.571668Ikävä sinua mies
Vuosia kuluu, mutta tunteet ei ole hävinnyt. Tasoittuneet toki, kun ei olla nähty. Järki palannut päähän kuitenkin. Se i191668Sulla on avaimet ja keinot
Jos haluat jatkaa tutustumista. Itse olen niin jäässä etten pysty tekemään enää mitään. Pidempi keppi johon on helpompi251415Orpo loukkaantui fasismiin viittaavasta sanavalinnasta
Mutta miksi loukkaantui? Orpohan on tehnyt yhteistyötä fasistien kanssa jo vuonna 2019, siis jo neljä vuotta ennen loukk271368Kiinnostaa - ei kiinnosta - kiinnostaapas
Selittäkää hämmentyneelle miksi miehiä ei ikinä kiinnosta silloin, kun sitä olisi itsekin kiinnostunut? Sitten kun siirt1271238