kcetinkaya
06/02/2008, 19:57
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double usalma(int a,int b)
{
int k;
double us=1;
if (b<0) {
a=1/a;
b=-1*b;
}
for (k=1;k<=b;k++)
us*=a;
return us;
}
int main()
{
printf("exp(5*log(2)) : %f \n",exp(5*log(2)));
printf("usalma(2,5) : %f \n",usalma(2,5));
printf("(int)exp(5*log(2)) : %d \n",(int)exp(5*log(2)));
printf("(int)usalma(2,5) : %d \n",(int)usalma(2,5));
return 0;
}
Arkadaşlar yukardıki kodun çıktısı niye aşağıdaki şekilde ?
exp(5*log(2)) : 32.000000
usalma(2,5) : 32.000000
(int)exp(5*log(2)) : 31
(int)usalma(2,5) : 32
Demek istediğim us almak icin iki farkli yol kullandim. Tekinde math.h kütüphanesindeki exp() ve log fonksiyonlarını kullanarak hesapladım diğerinde usalma() diye kendim ayrı bir fonksiyon yazdım. Gördüğünüz gibi math.h kütüphanesindeki exp() fonksiyonunu da benim kendi yazdığım usalma() fonksiyonu da double bir değere dönüyor. Bu değerleri ilk iki printf te olduğu gibi %f ile double olarak ekrana yazdırdığımda doğru sonuçlar görüyorum. Ancak (int)... ifadesi ile bu değerleri tür dönüştürme işlemine soktuğumda ekrana verdikleri çıktılar 31 ve 32 :S Normalde benim bildiğim double dan int e dönüştürme işleminde noktadan sonra olan kısım kesilip atılır kalan tamsayı kısım integer türü için değer olur. kendi yazdığım usalma() fonksiyonunda ve bugune kadar yazdığım tüm programlarda bu kurala uyarken neden exp() kullandığımda bu kurala uyulmuyor ? İşlemin çıktısı 31.99999999999999.... gibi bir değer olsa anlayacağım direk 31 olur dönüşüm işlemi sonu. Ancak oyle olduğu zamanda double olarak yazdırdığımda 32 yazmaması gerekir diye düşünüyorum. kafayı yemek üzereyim neden böyle neden böyle diye :S Bugune kadar yanlış mı biliyordum yoksa bir hata mı var ? Derleyiciden kaynaklanıyordur diye iki farklı derleyicide denedim TurboC ve Code::Blocks hiç farketmedi. Lütfen şunun nedenini söyleyin de içim rahatlasın yav :)
Şunu da belirteyim virgülden sonraki kısmı yazdırmamak için int e dönüştürmene gerek yok %.0f ile aynı işlemi yapabilirsin gibisinden öneriler sunmayın, benim amacım bunları ekrana yazdırmak tabii ki değil sadece size sorunu daha iyi anlatabilmek için yukarıdaki basit örneği yazdım.
Şİmdiden teşekkürler...
#include <stdlib.h>
#include <math.h>
double usalma(int a,int b)
{
int k;
double us=1;
if (b<0) {
a=1/a;
b=-1*b;
}
for (k=1;k<=b;k++)
us*=a;
return us;
}
int main()
{
printf("exp(5*log(2)) : %f \n",exp(5*log(2)));
printf("usalma(2,5) : %f \n",usalma(2,5));
printf("(int)exp(5*log(2)) : %d \n",(int)exp(5*log(2)));
printf("(int)usalma(2,5) : %d \n",(int)usalma(2,5));
return 0;
}
Arkadaşlar yukardıki kodun çıktısı niye aşağıdaki şekilde ?
exp(5*log(2)) : 32.000000
usalma(2,5) : 32.000000
(int)exp(5*log(2)) : 31
(int)usalma(2,5) : 32
Demek istediğim us almak icin iki farkli yol kullandim. Tekinde math.h kütüphanesindeki exp() ve log fonksiyonlarını kullanarak hesapladım diğerinde usalma() diye kendim ayrı bir fonksiyon yazdım. Gördüğünüz gibi math.h kütüphanesindeki exp() fonksiyonunu da benim kendi yazdığım usalma() fonksiyonu da double bir değere dönüyor. Bu değerleri ilk iki printf te olduğu gibi %f ile double olarak ekrana yazdırdığımda doğru sonuçlar görüyorum. Ancak (int)... ifadesi ile bu değerleri tür dönüştürme işlemine soktuğumda ekrana verdikleri çıktılar 31 ve 32 :S Normalde benim bildiğim double dan int e dönüştürme işleminde noktadan sonra olan kısım kesilip atılır kalan tamsayı kısım integer türü için değer olur. kendi yazdığım usalma() fonksiyonunda ve bugune kadar yazdığım tüm programlarda bu kurala uyarken neden exp() kullandığımda bu kurala uyulmuyor ? İşlemin çıktısı 31.99999999999999.... gibi bir değer olsa anlayacağım direk 31 olur dönüşüm işlemi sonu. Ancak oyle olduğu zamanda double olarak yazdırdığımda 32 yazmaması gerekir diye düşünüyorum. kafayı yemek üzereyim neden böyle neden böyle diye :S Bugune kadar yanlış mı biliyordum yoksa bir hata mı var ? Derleyiciden kaynaklanıyordur diye iki farklı derleyicide denedim TurboC ve Code::Blocks hiç farketmedi. Lütfen şunun nedenini söyleyin de içim rahatlasın yav :)
Şunu da belirteyim virgülden sonraki kısmı yazdırmamak için int e dönüştürmene gerek yok %.0f ile aynı işlemi yapabilirsin gibisinden öneriler sunmayın, benim amacım bunları ekrana yazdırmak tabii ki değil sadece size sorunu daha iyi anlatabilmek için yukarıdaki basit örneği yazdım.
Şİmdiden teşekkürler...