Bu sayfadaki yazılar
Sayfanın metni
Sayfa 20
erkese merhaba. Hatırlayacağınız gibi geçen sayıda polinomların yardımıyla bazı yılarının nasıl hesaplanacağı konusuna ise yazımda değinmeyeceğim, çünkü türev almayı çok iyi bilmeden bu polinomların katsayılarını hesaplayamazsınız. Eğer bu konuyla ilgileniyorsanız Ve fonksiyonların türevlerini rahatça alabiliyorsunuz ya Taylor ve McLaurin serileri konusunda ufak bir araştırma yapın, ya da bana yazarak basit bir şekilde katsayıların nasıl hesaplanacağını öğrenin. Ama bilgisayarınıza yeni fonksiyonlar eklemek gibi bir niyetiniz yoksa (ARC-COS gibi) bu fazladan bilgiye ihtiyacınız olmayacaktır. Eğer bir fonksiyon eklemeyi kafanıza koyduysanız, fakat matematik kısmından sıkılıyorsanız, ekleyeceğiniz fonksiyonun katsayılarını tanıdığınız bir matemasiniz. Bana bu konuda da yazabilirsiniz, fakat size vereceğim cevap bir matematik öğretmenininki kadar garantili olmayacaktır. Zaten büyük bir çoğunluğunuz bu konuda Geçen sayıda sizlere sorduğum faktöriyel hesaplama rutini konusunda hiç mektup ulaşmadı elime. Ama gene de size söz verdiğim gibi gelecek sayıya kadar bekledikten sonra doğru (en doğrusu olmasa da) rutin ve (eğer yollarsanız) sizin çözümlerinizi yayınlayacağım. Kısacası beklemedeyim. Eğer belli bir yerinde takıldıysanız, takıldığınız yer konusunda da bana danışın. Bu kadar çok konuda “bana yazın', *bana sorun' gibi lafları söylememin sebebi, sizlerden gelen mektupların arkasının kesilmiş olması, Sizlerden gelen bir yönlendirme olmadan konu seçiminde körlemesine gitmekten başka çarem kalmadığını uzun zamandır söylüyorum. Yaklaşık iki aydır sizlerden mektup olmadığım için bu konuların büyük bir kitleye hitap edemediğini düşünmeye baş-
om
Vedat Hallaç ladım. Bu yüzden gelecek sayıdan itibaren bu yazıyı bitirmeyi ve yeni Commodore'cular için bir makine dili kursuna başlamayı düşünüyorum. Bu kurs, makine dilinden hiç anlamayanlara göre düzenlenecek. Makine dili öğrenmek için çırpınan arkadaşlarınızı da belli bir seviyeye getirdikten sonra ROM'- un kullanımı gibi konulara geri döneceğiz. Gelecek sayıda bu konuda daha ayrıntılı bilgi bulabilirsiniz. Bu sayıda basit bir polinom hesaplatma örneğini verdikten sonra makine dilinin gerçekten de işe yarar konularda kullanılabileceğini gösteren bir program inceleyeceğiz. Son olarak da ROM'da bulunan önemli rutinlerin adreslerini ve bazı sabitlerin bulunduğu yerleri içeren bazı tablolarımız olacak. Hepimize kolay gelsin. Biliyorum, hepiniz polinom hesaplamaktan bıktınız, çünkü görünürde pek bir işinize yaramıyor. Ben de polinom hesaplamaktan bıktım, çünkü kullanıcı aşamasında gerekten de işe yaramıyor. Ama başladığımız işi tam olarak bitirmek için son bir polinom örneği daha yapmamız gerekiyor. Ayrıca, bu son örnekteki tipte bulunan polinomlar, çoğu fonksiyonun hesaplanmasında kullanılırlar. Bazı polinomlar aşağıdaki formda bulunabilir:
İ 34a2xx 174... Bu polinomu yeniden düzenlersek:
ral 2 *a3x(X12)134...)
Bunu hesaplamak için X yerine X 2koyarak polinomun değerini hesapladıktan sonra sonucu Y ile çarpmanız gerekir. Daha doğrusu ROM'da bu işi yapacak rutin bulunmasaydı yukarıda saydıklarımı yapmanız gerekecekti. Çoğu fonksiyonun polinomu bu formda olduğu için ROM'unuzda bu tip polinomların değerini hesaplayacak program hazır olarak kullanılmayı bekliyor. Bu şekilde tanımlanan bir polinomun değerini hesaplamak için geçen sefer anlattığım türde bir yapı oluşturduktan sonra (Başta polinomun derecesi, sonra da katsayılarının bulunduğu yapı. Hatırladınız mı?) $E043 adresine sıçramanız gereklidir. Bu polinomların işe yarayabilmesi için giriş değerinin belli sınırlar içine getirilmesi gereklidir. Periyodik bir fonksiyon kullanıyorsanız bu işi yapmak siiçin problem olmayacaktır. Mesela SIN (3 Xpi)'yi hesaplamaya çalışmak yerine SIN (pi)'yi hesaplamak yerinde olacaktır. Tabii ki ROM'da bulunan SIN fonksiyonu bu ayarlamaları sizin için yapacaktır. İsterseniz örneği bir an önce vereyim de bu sıkıcı konudan kurtulalım. Polinomumuz şöyle bir şey olsun:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 21
Y-6Xx40.5xx13-0.11xx17
Bu polinomda ilk olarak x 5'li terimin eksik olduğunu farketmenizi bekliyorum. Bu katsayı yerine sıfır koyarsak polinomumuz şu şekle girecektir:
7 bu polinomu hesaplayan rutini yazmak çocuk oyuncağı. Tablo 1'e bakın.
*-828 POLY2-$E043
LDA #<KATSAYI LDY #>KATSAYI JMP POLY2
*BYT 3 derecesi *FLP -.11 ;son katsayı *FLP O *FLP 0.5 .FLP 6
KATSAYI
katsayı
Tablo-1: Örnek polinomun değerini hesaplattıran program.
Geçen sayıda sizin assembler'ınızın .FLP gibi bir işlemi olmayabileceğini söylemiştim. Eğer bu işlem assembler'ınızda yer almıyorsa sayıların değerini şu yöntemle bulabilirsiniz: 1. BASIC'de hiç değişken yokken “A” komutunu girerek A değişkenine ikilik gösterimini bulmak istediğiniz sayıyı yerleştirin.
2. Bir monitör programına girin. Kartuşunuzun böyle bir programı varsa onu kullanın, yoksa 1. basamağı yapmadan önce monitör programını belleğe yükleyin ve BASIC'de kalın. 3. $2D-$2E adreslerinden yararlanarak ilk değişkenin yerini öğrenin. 4. Bu değişkenin harflerinden sonra gelen (hatırlarsanız ilk iki bayt değişkenin harflerini tutuyordu) beş baytın değerini bir yere not edin. Tablo 1'de de görebileceğiniz gibi polinom derecesi olarak 7 değil de 3 kullandık. Bunun sebebi, polinomu başta gösterdiğim gibi ayırdığınızda x 7'li terimin (X 12) 1 3 olarak görünmesidir. : Birkaç değer için fonksiyonumuzu denersek şu sonuçları elde ederiz: USR(0) =0 USR(1) =6.39 USR(2) = 1.92 USR(.75) =4.69625427 Daha kullanışlı konular da var... Kayan noktalı gösterimle ilgili konumuzu kapatırken çoğu zaman karşınıza çıkan bir problemin çözümünde makine dilinin ne kadar faydalı olacağını göreceğiz: Sayılarla dolu bir diziyi sıralamak. Makine dili programımız Tablo 2'deki rutinin yaptığı işi gerçekleştirmeye çalışacak.
100 FOR I-1 TO N : FL-0 110 FOR J-N TO I STEP -1
120 IF A(J-1)>A(J) THEN H-A(J)
130 NEXT J 140 IF THEN RETURN 150 NEXT I : RETURN
göre, bu sayıyla bir karşılaştırma daha yapmak pek de akıllıca olmayacaktır. Bu yüzden iç döngünün değeri son sayıdan ilk döngünün değerine kadar değişiyor yalnızca. Bu sayede karşılaştırma sayısını azaltarak hızı artırıyoruz. Bu işlemi yapılan bir ek daha var. Her “en küçük bulma” işlemi başında bir flag'i sıfırlıyoruz. Eğer yer değiştirme olursa bu flag'in değerini 1 yapıyoruz. Eğer “en küçüğü bulma” işlemi bittiği halde bu flag sıfırsa, bu taramada hiç yer değiştirilme yapılmamış olduğunu ve dolayısıyla dizinin sıralanmış olduğunu anlıyoruz. Bu karşılaştırma, özellikle yarı sıralı dizilerde dikkate değer bir hız artışı sağlıyor. İlk taramamız N'inci elemandan 0'ıncı elemana kadar tarıyor. İkinci turda ise N.'den 1.'ye kadar taranıyor ve bu işlem bu şekilde sürüyor. İsterseniz ilk olarak bazı koşullar koyarak bu sıralama rutinini olabildiğince basitleştirelim: 1. Dizimiz, dizi listesindeki ilk eleman olmalı.
2. Dizimiz tek boyutlu olmalı. 3. Dizimiz noktalı sayılardan oluşmalı (Tam sayı veya string'ler bu kuralları ihlal eder). Eğer dizilerin bellekte nasıl saklandığını hatırlarsanız (ya da geçen sayıyı bir daha
A(I)SA(J-1) : A(J-1)-H
Tablo-2: A(N) dizisini sıraya sokacak BASIC alt programı.
Bu program A(N) dizisinde yer alan sayıları küçükten büyüğe doğru sıralayacaktır. Çalıştırmak için ise sadece GOSUB 100 demeniz gereklidir. Rutin, en basit algoritma olan kabarcık sıralama (namı diğer BUBBLE SORT) tekniğini kullanıyor. Algoritmanın mantığı içerir. Eğer ardışık iki sayıdan ilki daha büyükse, onların yerleri değiştirilir. Tüm sayılar bu şekilde yukarıdan aşağı doğru tarandığı zaman en alttaki sayı en büyük sayı olur. Eğer tarama aşağıdan yukarı doğru yapılırsa (ki Tablo 2'de bu sistem kullanılmış) en üstteki sayı en küçük sayı olur. Tüm diziyi sıralamak istediğimize göre, bu işlemi tüm sayılar için tek tek yapmalıyız. Ama en üstteki sayının en küçük sayı olduğunu bildiğimize okursanız) bu kuralların sebebini daha kolay anlayacaksınız. Dizinin ilk eleman olması, diziler arasında doğru olanını bulmaya çalışmak gibi zahmetli(!) bir işten kurtaracaktır bizi. Tek boyutlu bir dizi kullandığımızda, elemanların yerini bulmaya çalışmak gibi işlerle uğraşmayız, çünkü ardışık iki eleman arasında beş bayt bulunduğunu biliriz. Son şık basit bir kontrolü daha yapmaktan kurtarıyor bizi. Eğer sıralanacak dizi tam sayı ya da string'lerden oluşuyorsa değişik yapıları test etmemiz gerekecekti, ki bu da daha uzun bir program oluşturacaktı. Tabii ki daha kapsamlı bir program daha çok işinize yarayacaktır. Fakat bu yazıya ayrılan sayfaların sayısı bu kadar detaylı bir çalışmaya izin vermiyor.