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
2352
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
Kuolemanrangaistus
Mielestäni kuolemanrangaistus on väärin kaikissa tilanteissa. Vaikka joku olisi murhannut 10 ihmistä, hänen surmaaminen633914Muistakaa persut, että TE petitte, ei kokoomus
Miksikö kukaan ei arvostele kokoomusta? No sen vuoksi, että kokoomus noudattaa vaalilupauksiaan. Sen sijaan TE persut,2053496Seuraava hallituspohja - Kokoomus, kepu, persut + KD
Kokoomus saa ainakin 20% kannatuksen ensi vaaleissa, keskusta sanoisin noin 15%, persut todennäköisesti enemmän, ehkä 172492949Outo ilmiö - vasemmistolaiset eivät kirjoita mitään kokoomuksesta
joka sentään johtaa hallitusta, ja jonka talouspolitiikkaa noudatetaan. Nämä muutamat vasemmistolaiset jotka täällä aina712499Maria Veitola kommentoi soutelija Saarion huomionhakuisuutta
"Minusta on jotenkin kuvottavaa, kuinka kovalla intensiteetillä Suomi-media seuraa miessankari Jari Saarion merihätää. S3211889Lopetan ikävöinnin
Ei meistä enää koskaan tule mitään. Olen ikävöinyt ja kaivannut enkä saa mitään vastakaikua ja lämpöä. Parempi erillään51622Väestöstä vain vassarit vaihtuvat nopeammin kuin persut
Kevääseen 2023 verrattuna vassareita 50 prosenttia enemmän, ja persuja 25 prosenttia vähemmän.121537Jos kaikki lopulta kuolevat, onko edes pahimmillakaan rikoksilla mitään väliä?
Kaikki kuolevat lopulta. Siksi ihmisten tekemillä rikoksillakaan ei lopulta ole mitään merkitystä. Joidenkin mielestä t21496Riikka Purra ei estä tehomaksun käyttöönottoa
Sähkön hinnoittelua koskevan määräyksen on määrä astua voimaan vuoden 2029 alusta, Energiavirastosta kerrotaan. Määräyk181496Muovipusseista pitäisi saada panttimaksu takaisin
Ostan joka päivä yhden muovipussin, ja niistä palautuu keskimäärin takaisin kaupan pullomaatin yhteydessä olevaan roskik511471