C' De Dünyanın En Basit Olayını Halledemedim
-
Utancımdan konuyu gizliycem gizlemeyim hadi..
#include <stdio.h> #include <stdlib.h> main() { int saglik; double c; printf("\nSaglik : "); scanf("%d",&saglik); c = (double)(1 + (2*( saglik / 100))); printf("Verim : %f",c); }
"Saglik " için ne girersem gireyim eğer tamsayı çıkıyorsa örneğin 200 girersem 5.00000 çıkıyor eyw doğru ama 50 girersem 2 yerine 1.0000 çıkıyor 60 girsem bile doğru ondalık sonucu alamıyorum.
Neden arkadaşlar neden oluyor neden kafamı toparlayamıyorum gece gece..
-
amacın 5.0000 yerine 5.00 almak mı tam anlayamadm hocam ne istion uyukluyomda :)
edit: hocam saglik ı da double oalrak tanımlasana bi başta -
double lari floatla degistir . dan sonraki sayilari isleme almaz yoksa
-
c = (double)(1 + (2*( saglik / 100.0)));bi boyle yap bakalim
-
Asker bunu yazdı:
-----------------------------
double lari floatla degistir . dan sonraki sayilari isleme almaz yoksa
-----------------------------aynı b.kun laciverti, yine aynı hocam..
-
geniuss bunu yazdı:
-----------------------------
c = (double)(1 + (2*( saglik / 100.0)));bi boyle yap bakalim
-----------------------------yaşa hocam..
-
hocam edit ledim ilk mesajımı ama görmezsn şimdi
saglik i int oalrak deilde double oalrak tanımlasana bi
edüt: çözülmüş -
geniuss bunu yazdı:
-----------------------------
c = (double)(1 + (2*( saglik / 100.0)));bi boyle yap bakalim
-----------------------------neden böyle peki hocam açıklayabilir misin ?
-
anubisx bunu yazdı:
-----------------------------
geniuss bunu yazdı:
-----------------------------
c = (double)(1 + (2*( saglik / 100.0)));bi boyle yap bakalim
-----------------------------neden böyle peki hocam açıklayabilir misin ?
-----------------------------50 girdin diyelim, saglik/100 deyince ikiside int olduğunda çıkan sonuç olan 0.5 i integer olarak görmüyo tam sayı olmadığından muhtemelende 0 olarak alıyo öyle işleme devam ediyo o yüzdened 1.000 çıkıyo senin cevap
-
hocam simdi, bilgisayar iki sekilde(iki birim uzerinden) matematiksel islem yapar.
bunlarin birtanesi, tamsayilar uzerinde islem yapar (ALU),
digeri ise rasyonel sayilar uzerinde islem yapar (FPU).Her iki birime ulasmak iki ayri makine kodu gerektirdiginden, fpu'yu kullanicagimizi derleyiciye bildirmeliyiz ki, o da calisabilen koda bunu o sekilde aktarsin. Yani rasyonel sayilarda toplama cikarma carpma veya bolme yapicagimiz zaman fpu'yu kullansin.
Bu c dilinde nasil saglanir.
Isleme giren iki operanddan birtanesinin rasyonel sayi tiplerinden herhangi birisi olmasi yeterlidir, sonuc da ayni sekilde rasyonel olucaktir.(float double).ornegin;
double d;
d = 100/35;yukaridaki islemde ALU kullanildigi icin islemin sonucu tamsayidir.
d = 100 / (double)35;
Burda ise fpu kullanildigi icin islemin sonucu rasyonel bi sayidir.
peki tum bunlari biliyoruz, sen ne diye bu kadar yazdin ki diyosunuz sanirim :)
simdi eger iki operanddan birisi rasyonel sayi iken islemin sonucu rasyonel bir sayi oluyorsa(yani bu islem icin fpu cagriliyorsa),
asagidaki gibi bi islemin fpu ya isletilmesi nasil saglanir.d = 5 / (4 * (3 / 2));
islem sirasi derleyici tarafindan belirlenir ve ALU veya FPUya calistirilicak kodlar ona gore uretilmeye baslanir.
Asagidaki islem sirasi yukarida ALU'nun isletmesini istedigimiz su islemin ki [d = 5 / (4 * (3 / 2));]
Sonuc1 = 3 / 2 // '3 / 2' iki operandda tamsayi oldugundan sonuc tamsayi olucaktir.
Sonuc2 = 4 * Sonuc1 //ayni sekilde
Sonuc3 = 5 / Sonuc2 //ayni sekilde
d = Sonuc3islemi en basindan FPUya yaptiralim.
d = 5 / (4 * ((double)3 / 2));
Sonuc1 = (double)3 / 2 // soldaki operand rasyonel oldugundan islem sonucu rasyoneldir.
Sonuc2 = 4 * Sonuc1 //'Sonuc1' rasyonel oldugundan Sonuc2 de rasyoneldir
Sonuc3 = 5 / Sonuc2 //'Sonuc2' rasyonel oldugundan Sonuc3 de rasyoneldir
d = Sonuc3Yani senin isleminde asagidakilerden herhangi birisi isini gorur.
c =1 + (2 * (saglik / 100.0));c =1 + (2 * (saglik / (double)100));c =1 + (2 * ((double)saglik / 100));umarim anlatabilmisimdir :)
