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.