Innostuin tuossa piin likiarvon erilaisista laskumenetelmistä ja päätin koodata ohjelman, joka laskee haluamani piin likiarvon luvut. Katsoin Wikipediasta sopivan algoritmin, ja kirjoitin seuraavanlaisen ohjelman:
#include <stdio.h> #include <iostream> #include <math.h> using namespace std; //laske tietty numero piin likiarvosta int laskePii(int i) { int palautus = ( 1/(16*i) ) * ( ( 4/(8*i+1) ) - ( 2/(8*i+4) ) - ( 1/(8*i+5) ) - ( 1/(8*i+6) ) ); return palautus; } int main(int argc,char **argv) { int alku,loppu,i,pii; cin >> alku; cin >> loppu; for(i=alku;i<loppu;i++) { pii=laskePii(i); printf("%i", pii); } printf("\n"); return 0; }
Kuitenkin, kun ajan ohjelman, se palauttaa piin arvoksi pelkkiä nollia... mistä tämä johtuu?
Lieneekö asialla jotain tekemistä sen kanssa, että kovasti yrität laskea kokonaisluvuilla (int)
Lasket kokonaisluvuilla, jolloin 1/x = 0, jos x > 1. Lisääpä lukujesi perään .0 ja muuta funktion ja muuttujien tyypiksi jokin liukulukutyyppi. Parhaan tuloksen saat long double
-tyypillä. Vielä parempiin pääsee tietenkin pidemmillä kaavoilla ja jollakin apukirjastolla, joka osaa laskea "pitkillä luvuilla" näiden tavallisten sijaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.