1. sayfa
c = a + b printf....c a = b b = c olmasi gerekmiyor mu.. |
Benim yaptığım şekilde çalışıyor fibonacci serisi. tek sıkıntı bir süre sonra sayılar negatif oluyor![]() |
Yok çalışıyordur da daha dediğim daha doğru bir ifade şekli olur en azından yazdığın koda bakanın amacı anlaması daha rahat olur.. yine de kendi seçimin.. sorununa gelince, ben programlama işinin ehli değilim ama sanki değişkenlerinin değerleri 'int' içerisinde tutamayacağın kadar büyük rakamlara çıkıyor gibi geldi.. 32 bit sistemlerde 'int' 4 milyar küsüre kadar çıkar.. onun üstünü tutamazsın.. int yerine double felan gibi daha büyük bişey kullanman lazım.. |
#include <iostream> using namespace std; int main() { double a=0,b=1,c,i; for(i=1;i<=100;i++) { c=a+b; cout << c << "\n"; b=a; a=c; } } |
100. fibonacci sayısı 354224848179261915075 |
Nasıl oldu o. Acaba sayının türünü mü değiştircem. Yukarıda bi arkadaş double ile yapmış. tam sayı olarak olmazmı ? |
int yerine unsigned int veya unsigned long kullanırsan sorunu çözersin. Bilgisayar hafızasında sayıların + ya da - işaretli olduklarını anlamak için en soldaki bit (int için 16 bitten en solda olanı) kullanılır; bu bit 0 ise sayı +, 1 ise sayı - kabul edilir. Sen fibonacci sayılarını hesaplarken bir noktadan sonra hesapladığın sayı 16 bitlik alanın 15 bitine sığamadığı için, 16'ıncı biti kullanmaya başlar ve onu 1 yapar, dolayısıyla sen de [signed] int kullandığın için, yani en soldaki biti işareti tutmaya kullandığın için bir anda kendini negatif sayıların arasında bulursun. unsigned int ve unsigned long en soldaki biti işaret için değil sayının kendi değerini tutmak için kullanır, dolayısıyla daha büyük sayıları hesaplayabilir ama negatif değer tutmazlar, daha doğrusu tuttukları değerin negatif mi pozitif mi olduğunu bilemezler. Double da 32 bit olduğu için muhtemelen 100'üncü fibonacciye kadar idare etmiştir. |
32 bit sistemde unsigned int ve unsigned long ikiside 32 bittir, yani bişey farketmez. Yerleşik tiplerde kullanılabilecek en uzun tip unsigned long long (64 bit) ki yukarıdaki 100. fibonacci sayısını o bile alamaz. Bu gibi işlerde harici bir kütüphaneden yardım almak en iyisi. Aşağıdaki kod GMP kütüphanesi kullanılarak 1000. fibonacci sayısını hesaplayıp yazdırıyor.
Çıktısı: 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875 |
Anladım teşekkkür ederim cevaplar için ![]() |
Tabi C ile daha haşır-neşir olan arkadaşlar daha doğru cevaplar veriyor. Bu arada @elektro_gadget "64 bite 100'üncü fibonacci sığmaz" deyince sırf meraktan ![]() 11000100101000100110000011100111111111011010100111001010001110 burada 62 hane var, dolayısıyla long long yeterli olur gibi geliyor bana. düzeltme: ikili düzendeki yazılışı o değilmiş, windowsun hesap makinesine sığmamış sayının tamamı, o yüzden çeviri yanlış çıkmış. 100'üncü fibonacci sayısı muhtemelen @elektro_gadget'in de dediği gibi sığmayacak 64 bite... |
long int kullan. |
1. sayfa
< Bu mesaj bu kişi tarafından değiştirildi SharpShoooterr -- 17 Kasım 2011; 1:16:48 >