Arkadaşlar Üslü ve köklü ifadeler nasıl hesaplanıyor?

Başlatan yuppi, 25 Mart 2005, 09:20:31

yuppi

Bir sayının kuvvetini nasıl alırız.Örnegin üç üzeri 0.8 gibi veya 5ci dereceden kök 3

SpeedyX

selamlar.
çarpma tekrarlı toplamadır yani
5 x 5 = 25
5+5+5+5+5 = 25
addwf veya addlw komutları asm de toplama işlemi için mevcuttur.
üs almaya gelince, o da sayının üssü kadar kendisiyle çarpılması demektir.
mesela
5^3 = 5 x 5 x 5 = 125 dir.

bölme ise tekrarlı çıkarmadan ibarettir.
çıkarmanın gerçekleşmediği anda (taşma olduğunda) ise çıkarılamayacak kadar küçük olan değer de kalandır.
subwf veya sublw komutları asm de çıkarma işlemi için mevcuttur.

two's complement alınarak da sadece toplama komutu kullanılarak çıkarma işlemi yapılabilir.

ayrıca bu işlemler için bir sayaç kullanman gerekir ve duruma göre sayacın içeriğini arttırmak veya azaltmak gerekir.
incf ve decf sırasıyla bir arttırma ve bir azaltma komutlarıdır.

bunlar basit ama yinede yazmak istedim. Kolay gelsin.

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

tnen

Merhaba arkadaslar eger programla değil donamımsal olarak olur diyorsanız National firmasının LH0094 Multifunction Converter u var bilgilerinize sunulur.

SpeedyX

Alıntı yapılan: "bunalmis"2^1.5 gibi hesabı  nasil yapacak ?
eğer üs tam sayı değil ise genişletme yöntemi kullanılabilir.

şimdi bunları sormak çok güzel ve çok rahat ama bu sayılara asm bir program ile nasıl ulaştığınızda önemli. hatta ulaşırmısınız?
ben 1.5 ile uğraşacağıma 1.5x10=15 ile uğraşmayı tercih ederim.
bu kısım birazda programcılığınıza kalmış.nasıl yapmak istediğiniz ile bağlantılı.
bazıları 1.5x2=3, 3 tamsayımı? evet.
ozaman istediğimiz kadar genişlemiştir şeklinde düşünürler (sayıyı büyütmemek için.)
bazıları ise virgülü bir basamak kaydırmak suretiyle işlem yapmayı yeğelerler. 1.5x10=15 (tamsayı)
iki yönteminde avantaj/dezavantajları mevcut.
tamamen tercih ve fikir meselesi.burada önemli olan hedefe en kısa yoldan ulaşmak.

SpeedyX

Alıntı yapılan: "bunalmis"2^1.5 gibi hesabı  nasil yapacak ?
işte şimdi sağlam bir cevap vereceğim.
tam olarak üs alma budur: q^n=e^(n*ln(q))
buradan :
öncelikle n*ln(q) nun sonucuna A diyelim.
asıl sonuç e nin kendisiyle A kadar çarpımıdır.
ln(q) dediğimiz ise 10 tabanına göre q'nun logaritmasıdır

bundan sonrasını 4işleme dönüştürmesi kolay.
zor olan ise e sayısının float tipi bir sayı olmasıdır.
onunla işlem yaparken tam kısme bir registerda, ondalık kısmı da başka bir registerda tutmak zorundasınız.
buna göre programınız ve düşünce tarzınızda biraz değişecektir.

Saygılar.

z

Peki a^b gibi bir ifadede a ve b program içinde değişik değerler alabiliyor ve tam sayı değillerse ne yapacağız?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

cozturk

Fourier serisine açacaz.
bu sayede tıpkı hesap makinaları gibi (neredeyse)  tüm fonksiyonları hesaplarız. Tabi radyana vs çevirmek gerekir.

z

@Çöztürk, Taylor yada McLaurine serisi demek istedin.

Bu tip üslü işlemler için floating point matematik kütüphanesi bulmak yada yazmak zorundasınız. (Bazı C derleyicilerinin zaten hazırda bu tip kütüphanesi olabilir)

İlle de bu işleri ben kendim yazacağım derseniz (asm de işiniz bayağı bir zor),  floating point 4 işlem ve logaritma fonksyonunu yazabilmeniz gerekir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

SpeedyX

Alıntı yapılan: "bunalmis"Peki a^b gibi bir ifadede a ve b program içinde değişik değerler alabiliyor ve tam sayı değillerse ne yapacağız?
Taylor'u açmamız gerekir.

q^n=e^(n*ln(q))
burada ln(q) yu açarsak 1/q+1/q^2
yani q^n=e^(n*(1/q+1/q^2))

bu yöntemi kullanarak yapacağınız hesaplamalarda sayıların değeri farketmez. tamsayı olmayabilir yada negatif olabilir (asm de olmaz yada signed int gibi kullanılırsa olur)
her iki sayıda tam sayı olmasa da bu yolla çözüme gidebiliriz.
ama tekrar söylüyorum :
Tamsayı olmayan sayıları ifade ederken tam kısmı bir değişkende, ondalık kısmıda diğer bir değişkende saklamalısınız. Tabiiki bu sizin işinizi zorlaştıracaktır. ve 8bitlik değişken kullanırken maximum 255 saklayacağınız için 3,3569818207 gibi sayıları saklayamazsınız,onun içinde ondalık ve tam kısımlar için ihtiyaç kadar sayıda değişken kullanmak gerekiyor. Bu da 4 işlemi zorlaştırır.