9 Mart 2025 Pazar

AutoLISP: Aritmetik ve Matematik Fonksiyonlar

AutoLISP, AutoCAD kullanıcıları için tasarlan güçlü bir programlama dilidir ve AutoCAD'in özelleştirme ve otomasyon yeteneklerini önemli ölçüde genişletir.

LISP dilinin AutoCAD'e uyarlanmış bir türevi olan AutoLISP, özellikle CAD (Bilgisayar Destekli Tasarım) ortamında çizim süreçlerini otomatikleştirmek, özelleştirilmiş işlemler gerçekleştirmek ve iş akışını hızlandırmak için tercih edilir.

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)
Tam sayılar, ondalık değer içermeyen tam sayılardır.
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.

Eğer izin verilen maksimum tam sayı sınırını aşan bir değer girerseniz, AutoLISP bu değeri bilimsel gösterimde bir reel sayı (float) olarak saklar. Bilimsel gösterimdeki sınırı aşan bir sayı olursa inf.0 (sonsuzluk) sonucu oluşur.

Örnek:
(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)
Ondalıklı sayılar, tam sayılardan farklı olarak ondalık nokta içeren sayılardır. AutoLISP'te bu sayılar reel sayı (float) olarak adlandırılır. Örneğin, 3.14 -0.5 2.0 geçerli reel sayılardır.

AutoLISP'te reel sayılar, 64-bit kayan noktalı (floating-point) sayılar olarak saklanır.
Bu nedenle, belirli bir hassasiyetle işlem yapabilir ancak çok büyük veya çok küçük değerlerde hata payı oluşabilir.

fix fonksiyonu, bir reel sayının küsuratını atarak tam sayıya dönüştürür (yuvarlama yapmaz).

AutoLISP'te çok büyük bir sayı hesaplanmaya çalışıldığında, sayı sınırları aşılırsa inf.0 (sonsuzluk) değeri döndürülür:

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

Toplama işlemi için + fonksiyonu kullanılır. Bu fonksiyon, birden fazla sayıyı toplamak için kullanılabilir.
(+ 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

Çıkarma işlemi için - fonksiyonu kullanılır. İlk sayıdan sonraki sayılar çıkarılır.
(- 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

Çarpma işlemi için * fonksiyonu kullanılır. Birden fazla sayıyı çarpmak için kullanılabilir.
(* 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

Bölme işlemi için / fonksiyonu kullanılır. İlk sayı, diğer sayılara bölünür.
AutoLISP, iki tam sayının bölümünde sonucu otomatik olarak tam sayıya yuvarlar. Bu, performans optimizasyonu için yapılmış bir tercihtir.
Sayıları bölerken 0 ile bölünmediğinden dolayı hata oluşturacağını dikkate alınız.
(/ 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

Sayıyı 1 arttırır.
(1+ 10) ;Sonuç: 11
(1+ -5.0) ;Sonuç: -4.0
(1+ 3.25) ;Sonuç: 4.25

1- fonksiyonu

Sayıyı 1 azaltır.
(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 sayı) : Verilen sayının mutlak değerini döndürür. Sayı negatif ise pozitif, pozitif ise değişiklik olmaz.
(minusp sayı) : Verilen sayının negatif olup olmadığını kontrol eder. Negatifse T, değilse nilsonucu döner.
(zerop sayı) : Verilen sayının sıfır olup olmadığını kontrol eder. Sıfırsa T, değilse nil sonucu oluşur.

Örnekler:
(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 sayi) : Sayının karekökünü verir.
(exp sayı) : Doğal logaritmanın tabanı e'nin belirtilen kuvvetini döndürür.
(log sayı) : Verilen sayının doğal logaritmasını döndürür.
(expt taban üs) : Belirtilen tabanın belirtilen kuvvetini(üssünü) döndürür.

Örnekler
(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ı

Trigonometrik hesaplamalar için aşağıdaki fonksiyonlar kullanılır:
AutoLISP'te trigonometrik fonksiyonlarda açılar radyan cinsinden girilir. Derece cinsinden bir açıyı radyana çevirmek için (* derece (/ pi 180)) formülü kullanılır.
(sin x) : x açısının sinüs değerini döndürür.
(cos x) : x açısının kosinüs değerini döndürür.
(atan x) : x açısının ark tanjant değerini döndürür.
AutoLISP dilinde tanjant ve kotanjant fonksiyonları bulunmaz. Bu işlemler için aşağıdaki formüller kullanılabilir
tanjant(x) = sin(x) / cos(x)
90° ve 270° gibi özel açılarda kosinüs sıfır olduğu için dikkatli olun.
kotanjant(x) = cos(x) / sin(x)
0° ve 180° gibi özel açılarda sinüs sıfır olduğu için dikkatli olun.

Örnekler:
(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 sayı) : Verilen sayıyı ondalıklı sayıya dönüştürür.
(fix sayı) : Ondalıklı sayının tam sayı kısmını döndürür.
(rem sayı1 sayı2) : Sayı1'in sayı2'ye bölümünden kalan sayıyı verir. Bazı dillerdeki MOD fonksiyonu

Örnekler:
(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.
(min sayı1 sayı2 sayı3 ...) : Sayılardan en küçük olanı verir.

Örnekler:
(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

İki veya daha fazla sayıyı bit düzeyinde AND (VE) işlemi uygular.
1 AND 1 = 1'dir. Diğer koşullarda sonuç 0'dır
; 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

İki veya daha fazla sayıyı bit düzeyinde OR (VEYA) işlemi uygular.
0 OR 0 = 0'dır. Diğer koşullarda 1'dir
; 101001 -> 41
; 101100 -> 44
; -------OR---
; 101101 -> 45
(logior 41 44) ;45
(logior 5 13 86) ;95
Sayı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

Genel bir bit düzeyinde işlem yapar. İşlem türü bir operatör ile belirtilir.
(boole operator sayı1 sayı2 ...)

Boole operatörleri:

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ü

(~ sayı) : sayının bit değerlerine NOT(DEGİL) uygular.

Örnekler:
(~ 1) ;-2
(~ 5) ;-6
(~ -6) ;5
Belirli 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

(lsh sayı kaydırma_miktarı) : Sayının bitlerini belirtilen miktarda sola veya sağa kaydırır.
Eğer kaydırma_miktarı pozitifse, sayı sola kaydırılır; eğer kaydırma_miktarı negatifse, sayı sağa kaydırılır. Her iki durumda da, sıfır bitleri içeri kaydırılır ve dışarı kaydırılan bitler atılır. Eğer kaydırma_miktarı belirtilmezse, kaydırma gerçekleşmez.

Örnekler:
;   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

İki sayının en büyük ortak bölenini hesaplamak için kullanılır.
(gcd sayı1 sayı2) : sayı1 ve sayı2'nin en büyük ortak bölenini döndürür.

Örnekler:
(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

AutoLISP'de doğrudan En Küçük Ortak Kat'ı hesaplayan bir fonksiyon bulunmamaktadır. Ancak, EKOK'u hesaplamak için gcd fonksiyonu kullanılabilir.
İki sayının EKOK'u şu formülle hesaplanır:

EKOK(a , b) = (|a * b|) / gcd(a , b)

Örnekler:
(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