Commodore sayı 75, sayfa 20

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 20

100 Y - A(N) 110 FOR IT - N-1 130 NEXT Y

Tablo-2: n. dereceden polinomun belirli bir X için değerini hesaplayan program.

n(n+1)/2 çarpma ve n toplama gerektirirken, Horner metoduyla n çarpma ve n toplama yapmak yeterli olmaktadır. Bu işlemi yapacak bir program yazmanın ne kadar basit olduğunu Tablo 2'de yer alan programdan da görebilirsiniz. Bu program n. dereceden bir polinomun belirli bir x için alacağı değer hesaplar ve sonucu y'de bırakır. A(k) dizisi de a0'dan an'e kadar olan katsayıları tutar. Bu anlattığım teori, fonksiyonların çoğunun bilgisayarlar tarafından hesaplanabilmesini mümkün kılar. BASIC yorumlayıcısı da n. dereceden polinom hesaplayıcı bir rutin sayesinde SIN, COS gibi fonksiyonları hesaplayabilir.

Polinom Değeri Hesaplama

Demin bahsettiğim rutin $E059 adresinde yer alır ve şu değerleri ister: FAC: x'in değerini tutar. Y, A: polinom değer tablosu. A — düşük değerlikli, Y— yüksek değerlikli. Polinom değeri tablosu, şu şekilde hazırlanmış olmalıdır.

polinom derecesi n n. derecenin katsayı değeri (n-1). derecenin katsayı değeri

1. derecenin katsayı değeri 0. derecenin katsayı değeri

Buradaki polinom derecesi tek baytlık işaretsiz bir sayıdır. n. derecenin katsayısı dediğimiz şey de x^n'li terimin katsayısıdır. Bu katsayı değerleri hep 5'er baytlık kesirli sayılar olarak saklanırlar. Artık bu bilgilerimizden yararlanarak polinom değerlerini hesaplayan bir rutin yazabiliriz rahatlıkla. Normal bir Assembler ile çalışırken kesirli sayıların datalarını belleğe geçirmek zordur. En kötü ihtimalle, bir değişkene bu kesirli sayıyı atayıp, bir monitör programı aracılığıyla

Böylece bu değişkenin datalarını kağıda yazıp, .BYT a,b,c,d,e şeklinde girebiliriz. Ama ASSEMBLER/MONITOR:64 kesirli sayıları doğrudan doğruya kaynak (source) listesine eklemenize izin veriyor. Bu iş için de .FLP komutunu kullanıyoruz. Assembler her .FLP gördüğü yerden sonra gelen sayıları otomatik olarak beşer baytlık kesirli sayı datasına çeviriyor. Neyse, sözü fazla uzatmadan bilgilerimizi ortaya koyalım ve şu polinomun lim:

Program 1'e bakarsanız bu hesabı yapan makine dili programını görebilirsiniz.

*-828 ;$033C, yani

kaset buffer POLINOM - $E059 LDA #<KATSAYI LDY #>KATSAYI JMP POLINOM 3 KATSAYI .BYT 4 .FLP 0.5 3A(4) .FPL -2.3 şA(3) .FLP 8.2 .FLP 2.5 şA(1) .FLP 0.7 şA(0)

) Program-1: Basit bir polinomun değerini hesaplayan program.

Rutinin tek yaptığı iş, katsayı adresini polinom hesaplayan ROM rutinine iletmek.

USR( ) Fonksiyonu

Peki bu POL(x) fonksiyonunu nasıl kullanacağız? SYS komutunu kullanmamız olanaksız. X değerini rutine nasıl ileteceğiz ki? Bize gereken, SIN( ), COS( ) gibi bir fonksiyon. Neyse ki BASIC yorumlayıcısı bunu da düşünmüş. Her türlü amaca hizmet etmek için USR( ) (USeR defined: kullanıcı tarafından tanımlanmış) adlı bir fonksiyon yaratmışlar. Bu fonksiyonu istediğiniz gibi tanımlayabilirsiniz. Sadece yorumlayıcıya fonksiyonun yerini bildirmemiz gerekli. Bu fonksiyonun yerini, her zaman yaptığımız gibi düşük-yüksek değerlikli bayt formatında 785/786 ($0311/$0312) adreslerine yerleştirmeliyiz:

POKE 785,828AND255:POKET86,828/256

Artık POL( ) fonksiyonumuz tanımlanmıştır. Şu komutu girerek bir test yapalım:

PRINT USR(1)

Sonuç olarak 9.6'yı ekranda görebilirsiniz. Bakalım doğru olmuş mu:

y=0.742.548.2-2.34

Daha fazla kontrolle uğraşmak isterseniz bir de şu döngüyü kurun:

FOR 1--5 TO 5:PRINT USR():NEXT

193.2 397.1 169.6 54,9 9.6 28.1 60.4 122.7 243.2

Eğer bir BASIC programında polinomlarla uğraşacaksanız ve aynı polinomu sık sık kullanıyorsanız, bu metod size kesin bir üstünlük sağlayacaktır. Tek başına kullanılsaydı 12.5 ms süren bu rutin çoğu BASIC fonksiyonundan hızlı çalışmaktadır. USR( ) fonksiyonunun yediği zamanı da hesaba katarsak 50 ms'ye çıkan bu süre gene de çok iyidir (isterseniz BASIC programla aynı işlemi yapmayı deneyin bakalım). Polinom derecesi arttıkça ve formül karmaşıklaştıkça rutin biraz daha yavaşlayacak, fakat hiçbir zaman BASIC'in o akıllara durgunluk veren yavaşlığına düşmeyecektir. Program 1'deki örnekte de iyice pekiştirdiğimiz gibi, katsayılar x'in en yüksek üslü değerinden başlar ve x olmayan terime doğru gider. Eğer bu sırayı doğru vermezseniz doğru sonuç alamazsınız. x=1'de yaptığınız kontrol de bu hatayı ortaya çıkarmaz. En iyisi x=1 ve x=0 vererek polinomları kontrol etmektir. Eklemem gereken bir şey daha var: Eğer herhangi bir terim formülde yoksa (y=1+4x gibi) bu terimin katsayısını sıfır alarak listeye eklemelisiniz.

Klavyeyle gezinmek için ← ve → tuşları.