Bununla ilgili GMP gibi kütüphaneler var biliyorum fakat benim asıl merak ettiğim mantık olarak nasıl yapabiliriz? Genel bir mantık, algoritma yada örnek kod gösterebilirseniz sevinirim. GMP'nin source codeunu inceleyecektim fakat C++'da iyi değilim komplike kodları okumam biraz zor.
Ilk aklıma gelen bir yapı oluşturup yapmak. Yani atıyorum içinde 3 tane int değişken olur ama siz uygun fonksiyonlarla bu 3 değişkeni tek değişken gibi yorumlayabilirsiniz.
Ilk aklıma gelen bir yapı oluşturup yapmak. Yani atıyorum içinde 3 tane int değişken olur ama siz uygun fonksiyonlarla bu 3 değişkeni tek değişken gibi yorumlayabilirsiniz.
mesela şöyle birşey olabilir sanırım. string tipinde sayı alınıp basamak basamak işlemler yapılıp yeni bir stringe atılabilir. yada string uzunluğu kadar tek rakam tutan bi array yaratılıp her basamak ordaki bi eleman olup ona göre işlem yapılbilir sanırım. şimdi bunları yapmayı deneyeyim teşekkürler hocam :D şimdilik sadece toplama çıkarma yapmayı deneyeceğim :D
Matematiksel olarak nasıl yapılıyorsa aynı tekniği uygulayabilirsiniz ama bu sadece deneysel olarak kullanılabilir. Normalde yoğun şekilde asm kullanılması gerekir. Mesela 64 bit toplama örneği verirsek (işlemci 32 bit olsun).
64 bitlik (doğal) değişken olmayacağı için bunu string ya da başka bir şekilde alırız. Sonra bunu sayı gösterimine çevirip 2 adet değişkene atarız. Bir değişken üst 32 biti ifade ederken diğeri alt 32 biti gösterir. Bu şekilde 2 adet 64 bitlik sayıyı 4 adet değişkene dağıttıktan sonra algoritma şöyle işler;
1- Alt 32 bitleri topla 2- Üst 32 bitleri topla 3- Taşma bitini (carry flag) 2. adımdaki sonuca ilave et.
Çoğu işlemcide taşma bitini ve değişkenleri birlikte toplayan komut bulunur. Böylece 2. ve 3. adımlar tek hamlede halledilir.
Asm kullanılmazsa sonucun taşıp taşmayacağını aritmetiksel olarak hesaplamak gerekir. Bu da işlemi onlarca kat yavaşlatır.
Matematiksel olarak nasıl yapılıyorsa aynı tekniği uygulayabilirsiniz ama bu sadece deneysel olarak kullanılabilir. Normalde yoğun şekilde asm kullanılması gerekir. Mesela 64 bit toplama örneği verirsek (işlemci 32 bit olsun).
64 bitlik (doğal) değişken olmayacağı için bunu string ya da başka bir şekilde alırız. Sonra bunu sayı gösterimine çevirip 2 adet değişkene atarız. Bir değişken üst 32 biti ifade ederken diğeri alt 32 biti gösterir. Bu şekilde 2 adet 64 bitlik sayıyı 4 adet değişkene dağıttıktan sonra algoritma şöyle işler;
1- Alt 32 bitleri topla 2- Üst 32 bitleri topla 3- Taşma bitini (carry flag) 2. adımdaki sonuca ilave et.
Çoğu işlemcide taşma bitini ve değişkenleri birlikte toplayan komut bulunur. Böylece 2. ve 3. adımlar tek hamlede halledilir.
Asm kullanılmazsa sonucun taşıp taşmayacağını aritmetiksel olarak hesaplamak gerekir. Bu da işlemi onlarca kat yavaşlatır.
peki sizce c++'ta bunu yapmaya çalışmak gereksiz mi? şuan amacım öyle kullanılcak bişey değil de kendimi geliştirme amaçlı
Amaç kendini geliştirmekse niye gereksiz olsun. Benzer bir konuyu şurada tartışıp örneklendirmiştik (ban yediğim için farklı isimle yazıyorum çaktırma)
Amaç kendini geliştirmekse niye gereksiz olsun. Benzer bir konuyu şurada tartışıp örneklendirmiştik (ban yediğim için farklı isimle yazıyorum çaktırma)
hocam şuan anladım baya, toplama/çıkarma/çarpma da sıkıntı yok en azında kafa da yok ama bölmeyi nasıl yaparım bilmiyorum. hani 9/3'ü 9-3-3-3 şeklinde yapıp kaç çıkarma olduğunu sayarak yapabiliriz. ama tam bölünmediği durumda küsüratı nasıl hesaplarım bilemedim.
Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesaja 2 cevap geldi. Cevapları Gizle
mesela şöyle birşey olabilir sanırım.
string tipinde sayı alınıp basamak basamak işlemler yapılıp yeni bir stringe atılabilir. yada string uzunluğu kadar tek rakam tutan bi array yaratılıp her basamak ordaki bi eleman olup ona göre işlem yapılbilir sanırım. şimdi bunları yapmayı deneyeyim teşekkürler hocam :D şimdilik sadece toplama çıkarma yapmayı deneyeceğim :D
64 bitlik (doğal) değişken olmayacağı için bunu string ya da başka bir şekilde alırız. Sonra bunu sayı gösterimine çevirip 2 adet değişkene atarız. Bir değişken üst 32 biti ifade ederken diğeri alt 32 biti gösterir. Bu şekilde 2 adet 64 bitlik sayıyı 4 adet değişkene dağıttıktan sonra algoritma şöyle işler;
1- Alt 32 bitleri topla
2- Üst 32 bitleri topla
3- Taşma bitini (carry flag) 2. adımdaki sonuca ilave et.
Çoğu işlemcide taşma bitini ve değişkenleri birlikte toplayan komut bulunur. Böylece 2. ve 3. adımlar tek hamlede halledilir.
Asm kullanılmazsa sonucun taşıp taşmayacağını aritmetiksel olarak hesaplamak gerekir. Bu da işlemi onlarca kat yavaşlatır.
Bu mesaja 1 cevap geldi. Cevapları Gizle
peki sizce c++'ta bunu yapmaya çalışmak gereksiz mi? şuan amacım öyle kullanılcak bişey değil de kendimi geliştirme amaçlı
http://forum.donanimhaber.com/m_73385316/tm.htm
Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesajda bahsedilenler: @GhilleintheMist
hocam şuan anladım baya, toplama/çıkarma/çarpma da sıkıntı yok en azında kafa da yok ama bölmeyi nasıl yaparım bilmiyorum. hani 9/3'ü 9-3-3-3 şeklinde yapıp kaç çıkarma olduğunu sayarak yapabiliriz. ama tam bölünmediği durumda küsüratı nasıl hesaplarım bilemedim.