AutoLISP, temel aritmetik işlemlerden karmaşık matematiksel hesaplamalara kadar geniş bir yelpazede işlev sunan dahili fonksiyonlara sahiptir. Bu fonksiyonlar, kullanıcıların çizim otomasyonu sırasında matematiksel hesaplamaları kolayca gerçekleştirmesine olanak tanır.
Ayrıca, AutoLISP'in esnek yapısı sayesinde, dilin dahili fonksiyonlarının yetersiz kaldığı durumlarda özel matematiksel işlemler için harici fonksiyonlar da geliştirilebilir.
Fonksiyonlara geçmeden önce AutoLISP dilinde kullanılan sayı türlerini görelim.
- Tamsayı (Integer)
AutoLISP'teki tam sayılar, -2,147,483,648 ile +2,147,483,647 arasında değer alan 32-bit işaretli sayılardır. Bazı fonksiyonlar ise yalnızca -32678 ile +32767 arasındaki 16-bit sayıları kabul eder.
(setq sayi 2147483648) ; Sonuç 2.14748e+009 ; Sayı integer sınırını aştığı için reel sayı. Bilimsel gösterim (setq sayi (expt 2147483648 -100)) ; Sonuç: 0.0 reel sayı ; Sıfıra yakın en küçük negatif sayı sınırını aştığı için 0.0 (setq sayi (fix 1.0e+308)) ; Sonuç: 1.0e+308 ; Sayı integer sayı sınırını aştığı için reel sayı olarak saklanır
- Reel (Ondalıklı) Sayı (Float)
AutoLISP'te sayılar dinamik olarak yönetilir, yani bir değişken hem tamsayı hem de reel sayı olabilir. Örneğin:
(setq sayi 5) ; Tamsayı(Integer) (setq sayi 3.14); Reel sayı(Float) (setq sayi 12.0); Reel sayı (setq sayi 15.); Reel sayı. Küsurat 0 ise noktadan sonra 0 yazılmayabilir. (setq sayi 1.0e-323) ; Sonuç: 9.88131e-324 (setq sayi 1.0e-324) ; Sonuç: 0.0 Sınırı aştığı için 0 (setq sayi 1.0e+308) ; Sonuç: 1.0e+308 (setq sayi 1.0e+309) ; Sonuç: inf.0 Sayı sınırı aştığı için sonsuz
Bu dinamik yapı, programcıya esneklik sağlarken, büyük veri setlerinde performans sorunlarına neden olabilir.
1) Temel Aritmetik Fonksiyonlar
a) Toplama. + fonksiyonu
(+ 1 2 3) ; Sonuç:6 (+ 20 -7) ; Sonuç:13 (+ 5 10.52 20.3 0.12) ;Sonuç: 35.94 (+ 1 2.0 3 4) ; Sonuç:10.0 (setq toplam (+ 12 34)) ;toplam = 46
b) Çıkarma. - fonksiyonu
(- 10 4) ; Sonuç: 6 (- 10 2 3.0) ; Sonuç: 5.0 (- 5 -5) ; Sonuç: 10 (- -5 -5) ; Sonuç: 0 (- 1 5 10) ; Sonuç: -14 (- -1 5 10) ; Sonuç: -16 (- -1 -5 -10) ; Sonuç: 14 (- 10 3 2 1.5) ; Sonuç: 3.5
c) Çarpma. * fonksiyonu
(* 2 3) ; Sonuç: 6 (* 5 10 2) ; Sonuç: 100 (* 2.0 7) ; Sonuç: 14.0 Küsuratlı(float) sayının sonucu küsuratlı olur (* 2 7.) ; Sonuç: 14.0 (* 8 0.5) ; Sonuç: 4.0 (* 10 -0.25) ; Sonuç: -2.5 (* 20 0.) ; Sonuç: 0.0
d) Bölme. / fonksiyonu
(/ 10 2) ; Sonuç: 5 (/ 1 2) ; Sonuç: 0 Tam sayıların(integer) sonucu tam sayı(integer) olur. (/ 1.0 2) ; Sonuç: 0.5 Küsuratlı sayının(float) sonucu küsuratlı(float) olur (/ 10 3) ; Sonuç: 3 Tam sayıların sonucu tam sayı olur. (/ 10 3.0) ; Sonuç: 3.33333 Küsuratlı sayının sonucu küsuratlı olur (/ 100 10 2) ; Sonuç: 5 (/ 10 0.5) ; Sonuç: 20.0 (/ 10 -0.25) ; Sonuç: -40.0 (/ 5 0) ; error: divide by zero (Sıfıra bölünme hatası) (/ 122 (/ 1 2)) ; error: divide by zero (/ 16 (- 7 7)) ; error: divide by zero
2) Arttırma ve Azaltma Fonksiyonları
1+ fonksiyonu
(1+ 10) ;Sonuç: 11 (1+ -5.0) ;Sonuç: -4.0 (1+ 3.25) ;Sonuç: 4.25
1- fonksiyonu
(1- 10) ;Sonuç: 9 (1- -5.0) ;Sonuç: -6.0 (1- 3.25) ;Sonuç: 2.25 (setq a 0 b 10) (while (/= a b); a b'ye eşit değilken (princ (strcat "\na:" (itoa a) " b:" (itoa b))) (setq a (1+ a) b (1- b)) ; a'yı 1 arttır, b'yi 1 azalt )
Birden çok fonksiyon kullanım örnekleri
; 5+20/2 => 5+(20/2) işlem önceliği /, sonra + (+ 5 (/ 20 2)) ;Sonuç: 15 ; 2*(20+1)*10/2 => 2*21*10/2 (* 2 (1+ 20) (/ 10 2)) ;Sonuç: 210 ;10 - 10/3 -3 => 10-(10/3)- -3 (- 10 (/ 10 3.0) -3) ; Sonuç: 9.66667
3) Mutlak Değer ve İşaret Fonksiyonları
(abs 15) ;Sonuç: 15 (abs -15) ;Sonuç: 15 (abs -15.0) ;Sonuç: 15.0 (float) (abs -3.14) ;Sonuç: 3.14 ;--- İki nokta arası yatay ve dikey mesafe --- (setq p1 (getpoint "\n1.nokta:") p2 (getpoint p1 "\n2.nokta:") ) (princ (strcat "\n2 nokta arası mesafe:" (rtos (distance p1 p2)) "\n2 nokta arası yatay mesafe:" (rtos (abs (- (car p1) (car p2)))) ;p1.x - p2.x "\n2 nokta arası dikey mesafe:" (rtos (abs (- (cadr p1) (cadr p2)))) ;p1.y - p2.y ) ) ;--------------------------------------------- (minusp -24) ;Sonuç: T (-24 negatiftir? Doğru) (minusp 24) ;Sonuç: nil (24 negatiftir? Yanlış) (zerop 0) ;Sonuç: T (0 sıfırdır? Doğru) (zerop 3) ;Sonuç: nil (3 sıfırdır? Yanlış) (zerop (- 5 5)) ;Sonuç: T (5-5 sıfırdır? Doğru) (zerop (/ 1 2)) ;Sonuç: T (1/2 sıfırdır(tam sayı)? Doğru) (zerop (/ 1 2.0)) ;Sonuç: nil (1/2 sıfırdır(reel sayı)? Yanlış)
4) Üs, kök ve Logaritma Fonksiyonları
(sqrt 81) ;9.0 (81'in karekökü) (sqrt 122) ;11.0454 (122'nin karekökü) (exp 1) ; 2.71828 (e-kuvveti) (log 10) ; 2.30259 (10'un doğal logaritmasını(e tabanına göre) verir) (/ (log 1000) (log 10)) ;3.0 (10'un kaçıncı kuvveti 1000 eder? 10^3=1000) (/ (log 8) (log 2)) ; 3.0 (2'nin kaçıncı kuvveti 8 eder? 2^3 = 8) (expt 2 3) ; 8 (2'nin 3. kuvveti? 2^3=8) (expt 5 2) ;25 (5^2=25) (expt 9 0.5) ; 3.0 (9'un karekökü) (expt 2 -3.0) ; 0.125 (1 / 2^3 = 1/8) (expt 64 (/ 1 3.0)) ;4.0 (64'ün küpkökü) (expt 2.0 -3) ; 0.125 ;Altın oran formülü kullanılarak Fibonacci dizisindeki bir terimi hesaplama (setq phi (/ (+ 1 (sqrt 5)) 2)) ;1.61803 Altın oran (/ (- (expt phi 8) (expt (- phi 1) 8)) (sqrt 5)) ;21.0 Fibonacci(8) ;Hipotenüs hesaplama (setq a 40 b 30) ; a=40 b=30 c=? (setq c (sqrt (+ (expt a 2)(expt b 2)))); c=karekök(a^2 + b^2) c=50.0
5) Trigonometri Fonksiyonları
tanjant(x) = sin(x) / cos(x)
(setq aciDerece 60) (setq aciRadyan (* aciDerece (/ pi 180.0))) ;1.0472 (60 dereceyi radyana çevirme) (sin aciRadyan) ;0.866025 (Sin 60) (cos aciRadyan) ;0.5 (Cos 60) (atan aciRadyan) ;0.808449 (Arktanjant 60) (/ (sin aciRadyan) (cos aciRadyan)) ;1.73205 (Tanjant 60 derece (karekök 3)) (/ (cos aciRadyan) (sin aciRadyan)) ;0.57735 (Kotanjant 60 derece (1 / karekök 3)) (sin (* 45 (/ pi 180.0)));0.707107 (Sin 45) (cos (* 30 (/ pi 180.0)));0.866025 (Cos 30) (atan 1);0.785398 (45 derecenin ranyan değeri) (* 45 (/ pi 180.0)); 0.785398 (45 derecenin ranyan değeri) pi; 3.14159 (pi sayısı. 180 derece radyan değeri) (* 4 (atan 1)) ;3.14159 (180 derece radyan değeri = pi sayısı) (* 180 (/ pi 180.0)); 3.14159 (180 derece radyan değeri = pi sayısı)
6) Ondalık, tamsayı ve kalan fonksiyonları
(float 5) ;5.0 (Reel sayı(Float)) (fix 10.25) ;10 (Tam sayı(integer)) (fix -10.25) ;-10 (Tam sayı(integer)) (fix 12.0) ;12 (Tam sayı(integer)) (fix pi) ;3 (Tam sayı(integer)) (/ 10 4) ;2 (10/4) (Tam sayı(integer)) (/ 10 4.0) ; 2.5 (10/4) (Reel sayı(Float)) (/ 10. 4) ; 2.5 (10/4) (Reel sayı(Float)) (/ 10 (float 4)) ; 2.5 (10/4) (Reel sayı(Float)) (float (/ 10 4)) ; 2.0 (10/4) Tamsayı reel sayıya dönüşür (rem 5) ;5 (rem 14 4) ;2 (14/4 bölme işleminde kalan=2) (rem 1 3) ;1 (rem -11 3) ;-2 (rem 11 3.0) ;2.0 (rem 5.5 2); 1.5 (rem 3.14 3) ;0.14 Küsuratlı sayının küsuratı (rem 10.25 10) ;0.25 Küsuratlı sayının küsuratı ;--- sayı tek mi çift mi? --- (rem 122 2) ;0 (122 çift sayıdır) (rem 123 2) ;1 (123 tek sayıdır)
7) En büyük ve en küçük değer fonksiyonları
(max sayı1 sayı2 sayı3 ...) : Sayılardan en büyük olanı verir.(max 3) ;3 (max 3 -3) ;3 (max 3 pi) ;3.14159 (max 10 -3 -7 12) ;12 (max (/ 1 3.) (/ 1 7.) (/ 1 -5.)) ;0.333333 (max pi 3 (/ 1 3.) (/ 1 7.) (/ 1 -5.)) ;3.14159 (min 5) ;5 (min 5 -5.) ;-5.0 (min 10 -3 -7 12) ;-7 (min (/ 1 3.) (/ 1 7.) (/ 1 -5.)) ;-0.2 (min pi 3 (/ 1 3.) (/ 1 7.) (/ 1 -5.)) ;-0.2 ;listede en büyük sayı (max '(8 0 -4 12 5 -7)) ; error: bad argument type: numberp: (8 0 -4 12 5 -7) (apply 'max '(8 0 -4 12 5 -7)) ; 12 ;listede en küçük sayı (apply 'min '(8 0 -4 12 5 -7)) ; -7
8) Bit Düzeyinde İşlemler
a) logand fonksiyonu
; 100111 -> 39 ; 111010 -> 58 ; -------AND-- ; 100010 -> 34 (logand 39 58) ;34 (logand 26 6 15) ;2 (setq sayi 15) (if (= (logand sayi 1) 0) ;1. bit 0 ise (princ "Sayı çifttir.") (princ "Sayı tektir.") )Belirli bir bitin açık olup olmadığını kontrol et
(setq sayi 172); 1010 1100 (172) (setq mask 4) ; 0000 0100 (3. bit) (if (/= (logand sayi mask) 0) (print "3. bit açık") (print "3. bit kapalı"))
b) logior fonksiyonu
; 101001 -> 41 ; 101100 -> 44 ; -------OR--- ; 101101 -> 45 (logior 41 44) ;45 (logior 5 13 86) ;95Sayının 3. bitini 1 yap
(setq sayi 28) ; 28 (0001 1100) (setq sayi (logior sayi 4)) ; 3. biti 1 yap (0001 1100 | 0000 0100) (print sayi) ; Sonuç: 28 (0001 1100) Zaten 3. biti 1 olduğu için değişmez (setq sayi 201) ; Yeni örnek: 1 (1100 1001) (setq sayi (logior sayi 4)) ; 3. biti 1 yap (1100 1001 | 0000 0100) (print sayi) ; Sonuç: 205 (1100 1101)
c) boole fonksiyonu
Operatör |
İşlem |
Sonuç 1 ise |
---|---|---|
1 |
AND |
Her iki giriş biti de 1'dir |
6 |
XOR |
İki giriş bitinden yalnızca biri 1'dir |
7 |
OR |
Giriş bitlerinden biri veya her ikisi de 1'dir |
8 |
NOR |
Her iki giriş biti de 0'dır (1'in tamamlayıcısı) |
d) ~ operatörü
(~ 1) ;-2 (~ 5) ;-6 (~ -6) ;5Belirli bitleri sıfırlama
(setq sayi 181) ; 1011 0101 (setq mask (~ 36)) ; 0010 0100 (36) 3. ve 5. bit 1 ; (~ 36 = -37) bitleri tersle (setq sayi (logand sayi mask)) ;181 sayısının 3. ve 5. biti sıfırlandı (print sayi) ; Sonuç: 145 (1001 0001)
e) lsh fonksiyonu
; 1010 -> 10 ; 101000 -> 40 (2 bit sola kaydırma. Sağına 2 adet 0 eklenir) (lsh 10 2);40 ; 10110 -> 22 ; 1011 -> 11 (1 bit sağa kaydırma) (lsh 22 -1) ;11 ; 101010 -> 42 ; 10101 -> 21 (1 bit sağa kaydırma) (lsh 42 -1) ;21
9) Ortak bölen, ortak kat
a) En Büyük Ortak Bölen. EBOB
(gcd 56 98) ; 14 (en büyük ortak bölen) (gcd 12 18) ; 6 (gcd 18 27) ; 9 (gcd 100 55) ; 5
b) En Küçük Ortak Kat. EKOK
(defun ekok (a b)(/ (abs (* a b)) (gcd a b))) ; ekok harici fonksiyonu (ekok 12 18) ; 36 (ekok 4 6) ; 12 (ekok 5 7) ; 35 (5 ve 7 asal sayıdır)Kaynak: Arithmetic Functions Reference (AutoLISP)
Hiç yorum yok:
Yorum Gönder