Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: power20 - 06 Aralık 2020, 12:28:46

Başlık: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: power20 - 06 Aralık 2020, 12:28:46
a,b,c,d  işaretli 8 bit sayılar oluyor. (-128 .. 127)

Aşağıdaki kıyaslamayı MCU veya bilgisayar ile en kısa sürede nasıl yaparım?
Mevcut hız yetersiz geldi. :)

(a² + b²) > (c² +d²)


Sayıların gerçekten karesini almadan bit düzeyinde işlem yapabilmek isterim.

a²+ b² = (a + b)² – 2ab     ve
a² + b² = (a – b)² + 2ab    eşitliklerini kullanarak süre  kısalmış olmadı.

Şu sayfadakileri anlamadım. Konu için faydalı mıdır?
https://math.stackexchange.com/questions/153603/diophantine-equation-a2b2-c2d2



Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: esensoy - 06 Aralık 2020, 13:10:06
(a+b) > (c+d) kareleri dikkate almasak yetiyor sanki?
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: muuzoo - 06 Aralık 2020, 13:13:42
Alıntı yapılan: esensoy - 06 Aralık 2020, 13:10:06(a+b) > (c+d) kareleri dikkate almasak yetiyor sanki?

(3+2) ve (4+0) de patlar hocam örnek olarak.
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: esensoy - 06 Aralık 2020, 13:22:40
O zaman kare tablosu oluşturup ordan çekmek mantıklı sanki
int16 kare[256] = {16384,16129,15876,15625,15376,15129,14884,14641,14400,14161,13924,13689,13456,13225,12996,12769,12544,12321,12100,11881,11664,11449,11236,11025,10816,10609,10404,10201,10000,9801,9604,9409,9216,9025,8836,8649,8464,8281,8100,7921,7744,7569,7396,7225,7056,6889,6724,6561,6400,6241,6084,5929,5776,5625,5476,5329,5184,5041,4900,4761,4624,4489,4356,4225,4096,3969,3844,3721,3600,3481,3364,3249,3136,3025,2916,2809,2704,2601,2500,2401,2304,2209,2116,2025,1936,1849,1764,1681,1600,1521,1444,1369,1296,1225,1156,1089,1024,961,900,841,784,729,676,625,576,529,484,441,400,361,324,289,256,225,196,169,144,121,100,81,64,49,36,25,16,9,4,1,0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529,576,625,676,729,784,841,900,961,1024,1089,1156,1225,1296,1369,1444,1521,1600,1681,1764,1849,1936,2025,2116,2209,2304,2401,2500,2601,2704,2809,2916,3025,3136,3249,3364,3481,3600,3721,3844,3969,4096,4225,4356,4489,4624,4761,4900,5041,5184,5329,5476,5625,5776,5929,6084,6241,6400,6561,6724,6889,7056,7225,7396,7569,7744,7921,8100,8281,8464,8649,8836,9025,9216,9409,9604,9801,10000,10201,10404,10609,10816,11025,11236,11449,11664,11881,12100,12321,12544,12769,12996,13225,13456,13689,13924,14161,14400,14641,14884,15129,15376,15625,15876,16129}
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: power20 - 06 Aralık 2020, 14:53:55
Kareler tablosu yaptım. Biraz süre kısaldı.
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: volkanunal - 06 Aralık 2020, 15:06:07
Bu tarz hesaplamalarda her zaman lookup table daha mantıklı oluyor hocam. Run-time içerisinde değil de yaptığınız gibi bir array içerisinde bulundurmak daha avantajlı olmakta. CRC hesaplarında da genel de look-up table yapıları mevcut.
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: z - 06 Aralık 2020, 16:32:13
(|a|+|b|)^2 - (|c|+|d|)^2 > 2(|ab|-|cd|) ise

(a^2 + b^2) > (c^2 + d^2) dir.
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: power20 - 06 Aralık 2020, 16:50:09
Burada kare almak asıl vakit harcıyor. Onu tabloyla hallettim. Sayıların bu uygulamada belli değerin üzerine çıkamayacağı anlaşıldığı için ufak tablo yeterli oldu.

Şimdi derleyicinin orijinal mutlak değer alma  fonksiyonu vakit harcıyor.

(Sayıyı kare almak için tabloya uygularken mutlak değer gerekiyor.)

Mutlak değerden kaçınmak için, negatif sayıyı yok edecek bir sayı ile toplarım, 2 kat büyük tablo yaparım diye düşündüm. Kare sorgulama tablosu.

Veya mutlak değeri kolay yoldan nasıl alırım?
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: esensoy - 06 Aralık 2020, 17:14:14
Mutlak değer almaya gerek var mı?
-1 i kare[0xFF] e ,
-2 yi kare[0xFE] ye
-3 ü kare[0xFD] ye
.
.
.
0 ve pozitifler kendi yerlerinde olacak, böylece kare[a] dan doğru değer gelecek,
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: power20 - 06 Aralık 2020, 17:19:24
Sayının duruma göre ne çıktığını bilmiyorum sabit değil. -25 in karesini tablodan nasıl alırım?  Köşeli parantez içine negatif index olur mu?
25in karesi = Kare[25]
-25in karesi?
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: esensoy - 06 Aralık 2020, 17:20:51
a=-25 ise;
kare[0xE7]=625 yerleştireceksiniz,
(-25 = 0xE7)
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: power20 - 06 Aralık 2020, 17:26:29
int sonuc, a;
a= 0xE7;
sonuc = kare[a];

   işretsiz sayı gibi düşünürsek E7 = 231 olduğunu gördüm.   C ile belki sorun çıkmaz .
Delphi hata verdi. Benim gibi düşünmüş. Negatif index olmaz diyor.
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: esensoy - 06 Aralık 2020, 17:59:08
İşaretli değişkeni işaretsizmiş gibi algılamasını sağlatabiliyor musunuz?

yani;
kare[(uint8_t) a] gibi??
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: Emre_Tuncay_ - 06 Aralık 2020, 21:18:32
Bu tarz bir şeye FPGA'de ihtiyacım olmuştu. Kare alırken çarpım işlemi yüzünden çok fazla saat frekansı harcıyordum işin içinden çıkamayınca öyle bıraktım.

Cordic algoritmasının sanki buna bir çözümü vardı. Sanırım kartezyen koorinat düzleminden, polar koordinat düzlemine geçişte kullanılıyordu. Cordic'in bu koordinat düzlemi çözümüne pek hakim değilim fikir vermesi açısından paylaşmak istedim.
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: RaMu - 06 Aralık 2020, 22:19:54
Kullanacağın mcu da DSP komutları varsa 3, 5 komut çevriminde yapılacak bir işlem gibi.
-----------------------------------


(a² + b²) > (c² +d²)yaklaşık değer veren aşağıdaki işlem:
a,b,c,d nin mutlak değerleriyle,
a<b ve c<d ile
(a>>1)+b ?> (c>>1)+d
şeklinde deneyip hata var mı karşılaştıran bir program ile doğrularsan kullanılabilir.
Kaynak:

https://stackoverflow.com/questions/3506404/fast-hypotenuse-algorithm-for-embedded-processor
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: power20 - 07 Aralık 2020, 20:43:55
Şimdi programın başka bir yeri önemli vakit alıyor.
Elimizdeki baytın bir sınır içinde olduğunu algılamamız gerekiyor. 

   
  if a > ust then
    sonuc = 5
  else if a < alt then
     sonuc = 3
   else
     sonuc = 1;

Baytın bir aralıkta olduğunu nasıl daha HIZLI algılarım?
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: RaMu - 07 Aralık 2020, 22:17:14
Sonra asm ne işe yarayacak boşverin diyorlar.

Ust Alt değerleri sabit ise Switch case ile hızlanır.

Ust Alt değerleri sabitse yine tablo kullanabilirsin.

Daha başka yöntemlerde vardır, düşünmek lazım.
Bu haliyle ne kadar sürüyor, asm çıktısına baktın mı?
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: power20 - 07 Aralık 2020, 22:42:20
Pin  toggle yaparak frekansmetre ile ölçüyorum. Bu kısmı iptal edince 2 kat kadar hızlanıyor.
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: serdararikan - 07 Aralık 2020, 23:15:08
İki kare farkı olarak denediniz mi?
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: power20 - 08 Aralık 2020, 00:05:35
Farkı değil toplamı kıyaslanması gerekiyor
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: z - 08 Aralık 2020, 00:09:21
Bu tip sorulara verilecek cevapta islemcinin komut kumesinde neler var sorusu cok kritiktir.
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: M.Salim GÜLLÜCE - 08 Aralık 2020, 03:10:18
beden kareleri yada mutlak değerleri üzerinde uğraşıyorsunuz..?
Neden sıfırdan büyük olup olmadıkları ve parantez içi (Kareleri olmadan) toplamlarının kıyasını yapmıyorsunuz..?

a>c ve b>d ise kestirmeden (a+b)>(c+d) ve  (a² + b²) > (c² +d²) diyebiliriz sanırım.
negatif iseler işaretini değiştirip test etmek ayrıca gerekir.
Tablo falanda gerekmez.
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: z - 08 Aralık 2020, 04:30:18
Sen sayıların hepsini pozitif kabul etmişsin.

Üstelik a>c fakat d>b ise ne olacak?
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: esensoy - 08 Aralık 2020, 08:33:24
Derleyicinin optimizasyon ayarlarını da mutlaka kontrol edin,
Belki hız yönündeki optimizasyon fark yaratır,
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: serdararikan - 08 Aralık 2020, 11:17:40
Alıntı yapılan: Kılıç - 08 Aralık 2020, 00:05:35Farkı değil toplamı kıyaslanması gerekiyor


(https://i.ibb.co/P9j9vw6/IMG-20201208-111501.jpg) (https://ibb.co/P9j9vw6)


Bu şekilde daha hızlı olabilir
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: Emre_Tuncay_ - 08 Aralık 2020, 12:21:49
@serdararikan Gösterdiğiniz yöntem bayağı mantıklı benim aklıma gelmemişti daha önceki yorumlarda benimde bu kıyaslamaya çözüm aradığımı söylemiştim.
Sizin yaklaşımınız 4 çarpımı 2 çarpıma indiriyor.
Bunu kullanıcağım.
Başlık: Ynt: Hızlı kıyaslama ? (a² + b²) > (c² +d²)
Gönderen: serdararikan - 08 Aralık 2020, 16:48:50
Alıntı yapılan: Emre_Tuncay_ - 08 Aralık 2020, 12:21:49@serdararikan Gösterdiğiniz yöntem bayağı mantıklı benim aklıma gelmemişti daha önceki yorumlarda benimde bu kıyaslamaya çözüm aradığımı söylemiştim.
Sizin yaklaşımınız 4 çarpımı 2 çarpıma indiriyor.
Bunu kullanıcağım.
En son kısımda c-d yazmışım c-b olacak