PDA

Tam Sürümünü Görmek İçin : printf nasil calisir?


ankakusu
03/06/2007, 13:37
bir şey soracağım. Ben bu printf'in nasıl çalıştığını anlamadım...

printf bir c++ fonksiyonu mu yoksa c fonksiyonu mu?

yukardaki kodun bir kısmına aldım.


printf("%3d in karesi %4d dir, ve kubu ise %6d dir..\n", i+offset, KARE(i+offset), KUP(i+offset));

printf("%3d in HATALIsi ise %6d dir.\n",i+offset,HATALI(i+offset));

Mesela offset ilk başta 5 diye tanımlanmış ve i değişkeninin de ilk değeri 1. İlk for döngüsü için bana alttakini döndürecek:

6 in karesi 36 dir, ve kubu ise 216 dir..
6 in HATALIsi ise 16 dir.

Şimdi %3d ne demek oluyor.
Çıktıda 6 gibi gözüküyor.
6 burada (i+offset) değil mi?

Sonra %4d dediğimiz de
çıktıda 36 gibi gözükmüş.
Yani orada KARE(6)
hesaplamasının
sonucunu görüyoruz.

Buradaki %3,%4, %6 filan ne oluyor?


acehreli
03/06/2007, 18:54
printf bir C fonksiyonudur; dolayisiyla C++'ta da calisir. printf icin mutlaka bir belge bulmani oneririm cunku cikisa nasil yazdirilacagini belirlemek bazen karisik olabiliyor.

Senin sorduklarini kisaca yanitlayabilirim: Tahmin ettigin gibi, % ile baslayan duzen belirtecleri, sira ile printf'e verilen parametrelere karsilik geliyorlar.

% belirtecinin son karakteri, yazdirilacak olan seyin tUrUnu belirliyor. %d, ondalik sayi anlamina gelir.

%'den sonra gordugun tamsayi, yazdirilacak olan seyin en az kac hane olarak yazdirilacagini soyluyor. Onun icin %4d icin en az dort tane yer birakiliyor ve sen

"karesi 36"

olarak goruyorsun. 36'dan hemen onceki iki bosluk %4d yuzunden geliyor.

Ali

ankakusu
03/06/2007, 23:58
alttaki kodu compile ettim:

#include <stdio.h>
main ()
{
int i; //derleyiciye göre kaç bit olduğu değişiyor
short j; //16 bit integer
long k; //32 bit integer
float a; //single precision floating point
double b; //double precision floating point

k=72000;
j=k;
i=k;
b=0.1;
a=b;
printf( "\n%1d %d %d\n%20.15f\n%20.15f",k,j,i,b,a);
}

sonuc olarak şöyle bir çıktı verdi:

72000 6464 72000
0.100000000000000
0.100000001490116


Ali'nin anlattığı mantıkla şöyle yorumlayabiliriz:
d decimal ise f de float demektir ama 20.15
ne anlama geliyor bilemedim...

çıktıda 6464 nasıl çıktı matıken onun da 72000
olması gerekmiyor mu? Orayı anlamadım...

Bir de float ve double arasında bu kadar fark var mıydı böyle?
Bilmiyordum. Ben 'double precision' ve 'single precision'
kavramalarını farklı biliyordum burada yazana göre.

single precision dediğimiz virgüllü sayılarda virgülden sonra
bir basamaklık bir rakamın olması.
Örnek: 0.2

0.23 0.30 veya 4.5 sayıları da double precision olur.

Ben mi yanlış biliyorum?

Teşekkürler,
Kolay gelsin...

Euclides
04/06/2007, 00:11
yazalım
k bir double word olup değeri = 0x00011940
j bir word olup değeri = k & 0xFFFF 'dir.
0x00011940 & 0xFFFF = 0x1940
bununda 10'luk tabanda yazarsak 6464 eder.

tabii bunu gider 64bit bir derleyicide derlersek ne olur ??? hiçbir fikrim yok :)

acehreli
04/06/2007, 00:20
int'in kac bit oldugunun derleyiciye gore degistigini soyluyorsun ama bunun short ve long icin de gecerli oldugunu unutuyorsun. :) Orada soyledigin 16 ve 32 kimbilir hangi ortamda oyledir.

f harfi konusunda tahminin yanlis olmus. %f double tUrU icin kullanilir. Zaten C'de ve C++'da "dogal olan" virgullu sayi tUrU double'dir. float, ancak cok gerektigi zaman, kesin ve kesin bir neden oldugu zaman kullanilir. Bu isin en kolayi su: float yok; double var...

Ayrica double ve float basli basina ayri turlerdir. Virgulden sonraki hane kullanimi ile ilgisi yoktur. Ikisini de virgulden sonra istedigimiz hane ile gosterebiliriz. Belirli bir haneden sonrasi hatali gosterilir ama yine de istersek olur.

j'nin turu short oldugu halde printf'e onu %d olarak yazdirmasini soyluyorsun. Tanimsiz davranis... :( short icin %hd kullanman gerekirdi. Bu hatadan sonra artik programdan herhangi tanimli bir davranis bekleyemeyiz.

%20.15f'in anlami su: virgulden once en az 20 hane ayir, virgulden sonra 15 hane kullan.

Ali