Tek satır kodla sinus hesaplama integer.

Neyse Iranli dedemiz bunu 1427 yilinda algoritmik hale getirmis. Dedemizin adi Al Kashi.

[math]y=log_x(x)[/math]
[math]x=2^y[/math]
logaritmasi alinacak sayimizi

[math]1\leq{x}<2[/math]
araliginda normalize edersek

[math]0\leq{y}<1[/math]
olacaktir.

y'yi ikili seri olarak yazarsak

[math]y=y_1 2^{-1} + y_2 2^{-2}+y_3 2^{-3}+y_4 2^{-4}+ ...[/math]
[math]y=2^{-1}(y_1 + y_2 2^{-2}+y_3 2^{-3}+y_4 2^{-4}+ ...)[/math]
[math]x=2^{2^{-1}(y_1 + y_2 2^{-2}+y_3 2^{-3}+y_4 2^{-4}+ ...)}[/math]
Karesini alirsak

[math]x^2=2^{y1}* 2^{2^{-1}( y_2 +y_3 2^{-1}+y_4 2^{-2}+ ...)}[/math]
Eger X^2 1 den yada 2 den buyuk ise

y1 hakkinda 0 mi 1 mi yorumunu yapacaksin.
 
Son düzenleme:
Neyse Iranli dedemiz bunu 1427 yilinda algoritmik hale getirmis. Dedemizin adi Al Kashi.

[math]y=log_x(x)[/math]
[math]x=2^y[/math]
logaritmasi alinacak sayimizi

[math]1\leq{x}<2[/math]
araliginda normalize edersek

[math]0\leq{y}<1[/math]
olacaktir.

y'yi ikili seri olarak yazarsak

[math]y=y_1 2^{-1} + y_2 2^{-2}+y_3 2^{-3}+y_4 2^{-4}+ ...[/math]
[math]y=2^{-1}(y_1 + y_2 2^{-2}+y_3 2^{-3}+y_4 2^{-4}+ ...)[/math]
[math]x=2^{2^{-1}(y_1 + y_2 2^{-2}+y_3 2^{-3}+y_4 2^{-4}+ ...)}[/math]
Karesini alirsak

[math]x^2=2^{y1}* 2^{2^{-1}( y_2 +y_3 2^{-1}+y_4 2^{-2}+ ...)}[/math]
Eger X^2 1 den yada 2 den buyuk ise

y1 hakkinda 0 mi 1 mi yorumunu yapacaksin.

Delphiden anlamadığım için kötü zannaettim ama kod gayet iyiymiş

c de yazdım gayet küçük güzel bir algoritma.

log2:
 void loghh(floatxx)
   {

   float kk=xx; float qu=0;
   for(int c=0;c<31;c++)  { if(kk>2)  kk/=2;  else break;  qu+=1; }

   float b=0.5f;   xx=kk;
   for(int k=0;k<25;k++) { xx*=xx; if(xx>=2) { xx/=2; qu+=b;} b/=2; }
    return qu;
   }


Hocam üs alma ile ilgili de böyle bir tırik var mı ?
 
Son düzenleme:
Pow da bitti

pow:
 float p2p[]={2.0f,1.4142135f,1.1892071f,1.0905077f,1.0442737f,1.0218972f,1.0108893f,1.0054299f,1.0027113f,
               1.0013547f,1.0006771f,1.0003386f,1.0001693f,1.0000846f,1.0000423f,1.0000211f,1.0000106f,1.0000052f
               ,1.0000026f,1.0000013f,1.0000007f,1.0000004f,1.0000001f,1.0000001f };


  void loghh(float ssy,float pow)
   {


   float kk=ssy; float qu=0;
   for(int c=0;c<31;c++)  { if(kk>2)  kk/=2;  else break;  qu+=1; }

   float xx=kk;  float b=0.5f;
   for(int k=0;k<25;k++) { xx*=xx; if(xx>=2) { xx/=2; qu+=b;} b/=2; }
  ////log

  ///pow
    qu*=pow;

   float ou=1.0f;

    while(qu>=1.0f) {  qu-=1; ou*=2.0f;  }
    int jj=(int)(qu*0x7fffffff);
    for(int r=0;r<23;r++)  {  if(jj<0) { ou*=p2p[r]; }  jj<<=1;   }
    
    return ou;
    }


resim_2024-01-28_230812571.png
 

Ekler

  • pow.zip
    77.8 KB · Görüntüleme: 95
arccos arcsin sonuçlar tam doğru.

acos:
 void acoss(float ssy)
   {

   float ax=1.0f; float ay=0.0f; float bx=0.0f; float by=1.0f,cx,cy;
   float a=0.0f,b=1.5707963f;   float sd;  int eks=0;  if(ssy<0) { ssy=-ssy;  eks=1;  }  ssy=fmod(ssy,1.0f);
   for(int h=0;h<25;h++)  {

   sd=(a+b)*0.5f;  cx=(ax+bx)*0.5f;  cy=(ay+by)*0.5f;

   float u=cx*cx+cy*cy; u=sqrtf(u);  cx/=u; cy/=u;  if(ssy<cx)  {  ax=cx; ay=cy; a=sd;  } else {   bx=cx; by=cy; b=sd;   }  }

   if(eks) {  ssy=-ssy; sd=3.1415926f-sd; }
   return sd;
   }

@Mikro Step evet tüm sayılar.
 

Ekler

  • acos asin.rar
    128 KB · Görüntüleme: 110
Algoritmaya ait kodu vermen iyi bir sey ama algoritmayi anlatman lazim.

Algoritmayi anlatmak ve algoritmik kodu okutmak cok farkli seyler.
 
Bu senin sin ve cos algoritmalarini inceliyorum.

Algoritmanin matematik alt yapisini bulmaya calisiyorum.

Zamaninda carpma, isaretli sayilarla carpma, bolme vs vs algoritmalarini ezberlemistim.
Bu adamlar ne kadar akilli, nasil bulmuslar bunlari diye icimden gecirirdim.

Seneler seneler sonra bu islerin oyle olmadigini anladim/ogrendim.
 
intelin fpu instruciton setine baktım ne kaldı diye, pow , acos, asin onlarda yok inteli geçmişim de haberim yok :katil2:.
İntelde çalışan birisi vardı nerede o. Ayırca intel de cordic kullanıyormuş , benim kod cordicten daha hızlı cordik nedeni ile acos yok atan var ..

Şİmdi bulmamız gereken sqrt işlemi mod işlemi, sqrt a özel bir tırik olabilir ,pow gibi olduğunu düşünmüyorum .

hocam sin cos harbiden anlamadın mı ilk sayfada resim var onu biraz incelesen hemen anlarsın koda bakma.

Bu kodların tamamına animasyonlu bir video çekeceğim animasyonu nasıl yapacağım diye düşünüyorum ,bunun içinde bir program yazmak gerekecek heralde..
 
Cordic'ten hizli olmasi imkansiz.

Neden dersen her bir isleme fiyat bic.

Mesela toplama ve cikartma 1 TL.
Carpma 10 TL
Bolme 100 TL
Karekok 1000 TL

Ardindan sinus hesaplamanin maliyetini cikart.

Yok boyle yapmam dersen timing olc.

Coordicte Atan hesaplanip geri kalanlari (asin, acos vs) bundan hesaplanir.

sqrt islemine artik ihtiyacin yok. Ust almayi hesaplamistin. sqrt(x)=x^0.5 demek.

Bir de PC de calisirken FPU unitesi isin icine girer.

O yuzden bunu PC de degilde FPU olmayan bir MCU da kosturmak lazim.
 
cx=cx/u cy=cy/u icin nasil bolme islemi yok dersin.

u=sqrt(cx*cx + cy*cy) isleminde de karekok var.

Cordicte kaydir topla var sadece.
 
Internetin olmadigi donemde elementel fonksiyonlarla ust duzey fonksiyonlarin hesaplanmasina bir kac yilimi verdim.
O yuzden cok sevdigim bir konu.

u dedigin seyin esasen 1 olmasi lazim.

Neyse simdi aciklama yapma. Bulmaca diye ugrasiyorum simdi.
 

@devreci nin algoritmasini ucgenlerle anlatan simulasyon.

Birisi 0 derece, digeri 90 derece olan iki dik ucgen var.
Verilen acinin sin degeri soruluyor.

Verilen aci bu iki dik ucgen arasindaki bir baska dik ucgenin acisidir. Amac bu dik ucgeni bulmak.

Iki dik ucgenin acilarinin tam ortasi bize sorulan acidir deyip basliyoruz ve bu iki dik ucgenin kanarlarinin ortalamasi bizim yeni ucgenin kenarlardir deniyor.

Tabiki bu hesap cok yanlis. Ardindan hipotenus hesaplanip bu hipotenusu veren dik kenarlar yaklasik olarak hesaplaniyor.

Her yeni hesaplanan ucgen verilen aciya daha cok yakinsiyor haliyle kenarlarda yakinsiyor.

aradigimiz sin degeri karsi dikkenarin uzunlugu.

Neyse simulasyon zaten anlatiyor.
 
Son düzenleme:
Exe de karşılatırma yapmışım zaten tam doğru değer hesaplıyor , ilk sayfada exe var, hatayı göstermişim 1e-8 hata float hassayeitdir. Virgülden sonra 8 basamak floatta tanımsız. döngüyü arttırareak sonsuz hassaiyete ulaştırabiliriz. Sende kaç çıktı ,normal sin işlemi ile kıyasla.

Hocam mantığı halen tam anlamadın. Sadece sin değil cos u da hesaplıyor.
Birisi 0 derece, digeri 90 derece olan iki dik ucgen var.
Verilen acinin sin degeri soruluyor.

Verilen aci bu iki dik ucgen arasindaki bir baska dik ucgendir. Amac bu dik ucgeni bulmak.

Bu da doğru değil.
 
Son düzenleme:
Aynen dedigim gibi calisiyor. Ucgenler birim daire icindeki ucgenler oldugu icin yatay kenar cos iken dikey kenar da sin degeri oluyor.

Daha algoritmani taniyamamissin.

Simulasyonu calistirmadin mi?

Simulasyon ekraninda PCnin kendi verdigi deger ve algoritma ile hesaplanan deger veriliyor zaten.
 
Yahu sordugun sorularin cevabi simulasyonda.

Calistir, ucgenleri sana cize cize gosteriyor.

Sin 55 ogrenmek istiyorsan aci kutusuna 55 yazip sin tusuna basacaksin.

Anlat tusuna basacaksin sana adim adim mantigi anlatacak.
 
Hocam tanımlarsın o noktaya istersen dairede çizersin elips de , ama öyle değil , nokta alıyoruz e noktayı da istersen dik üçgenle tanımla istersen ikizkenar üçgenle tanımla.

Tabiki bu hesap cok yanlis. Ardindan hipotenus hesaplanip bu hipotenusu veren dik kenarlar yaklasik olarak hesaplaniyor.

Peki neden çok hatalı dedin , şimdi delphide sonuçların hatalı olmadığını , kodlayacaksın ve bize göstereceksin :katil2: artık buna mecbursun :katil2:
 
Tamam anlasildi.

Oyle demedim.

Simdi ilk baslangicta iki dik ucgen var.
Birisinin aci 0. Yani x ekseninde yatik.
Dikeri 90 derece. Yani y ekseninde dik.
Her ikisi de orjinde.

Boylari 1.

simdi bir acinin sinusunu hesaplayacagiz. Diyelimki 60 derece.

60 derecelik ucgen 0 ve 90 derecelik ucgenlerin arasindadir.
Bunun icin bu iki acinin ortasi bizim ucgendir diyoruz. (Yani cok hatali bir ongorude bulunuyoruz.)

Bahsettigim hata bu hata.

Algoritma adim adim bizim aciya yakinsiyor.

0, 45,.......... en sonunda 60 oluyor. Aci 60 dereceye yakinsarken ucgenin kenarlari da sin ve cos degerlerine yakinsiyor.

Algoritma hata yapiyor demedim.
 
Hocam tanımlarsın o noktaya istersen dairede çizersin elips de , ama öyle değil , nokta alıyoruz e noktayı da istersen dik üçgenle tanımla istersen ikizkenar üçgenle tanımla.



Peki neden çok hatalı dedin , şimdi delphide sonuçların hatalı olmadığını , kodlayacaksın ve bize göstereceksin :katil2: artık buna mecbursun :katil2:

Hayir oraya ucgen cizmek zorundasin. Neden? Cunku hipotenus hesaplatiyorsun. Ardindan da
x=x/hipotenus ve y=y/hipotenus hesapliyorsun.

Normalde hipotenus her bir iterasyonda 1'e dogru yakinsarken kenarlar da sin ve cosa yakinsiyor.

Delphide verdigim simulasyon istedigin sonuclari hesapliyor ordan kac digit dogru olduguna bakabilirsin.
 
Algoritmani iyi tanimiyorsun.
2. Dongude 67.5 dereceyi buluyor ya. Bu kesin dogru. Yani hic hatasi yok.

Fakat bu asamada sin ve cos degerleri yaklasik dogru. Cunku hipotenus bu asamada 1' e yakin bir deger ama tam 1 degil. Eger 1 olsaydi sin ve cos kesin dogru olurdu.

Iterasyon ilerledikce hipotenus 1'e yakinsiyor x ve y de cos ve sine yakinsiyor.
 
Algoritma matematik anlamda cok guzel. Fakat Bilgisayar programciligi icin kulfetli.
Bolmeler ve karekok olmasaydi tadindan yenmezdi.

Eger bu algoritmayi sen gelistirdiysen tebrikler.
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,950
Mesajlar
118,718
Üyeler
2,822
Son üye
lalemasall

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top