বিভাগ থেকে মুক্তি পাওয়ার জন্য আপনি লগারিদম ব্যবহার করতে পারেন। জন্য (x,y) প্রথম পাদ মধ্যে:
z=log2(y)−log2(x)atan2(y,x)=atan(y/x)=atan(2z)
চিত্র 1. আতনের প্লট ( 2 জেড )atan(2z)
আপনি আনুমানিক করতে হবে atan(2z) সীমার মধ্যে −30<z<30 1E -9 আপনার প্রয়োজনীয় সঠিকতা জন্য। আপনি প্রতিসম আতন ( 2 - z ) = π এর সুবিধা নিতে পারেন πatan(2−z)=π2−atan(2z)বা বিকল্পভাবে নিশ্চিত করুন যে(x,y)একটি পরিচিত অক্ট্যান্টে রয়েছে। আনুমানিকlog2(a):
b=floor(log2(a))c=a2blog2(a)=b+log2(c)
b সবচেয়ে উল্লেখযোগ্য নন-শূন্য বিটের অবস্থান সন্ধান করে গণনা করা যেতে পারে। c একটি বিট শিফট দ্বারা গণনা করা যেতে পারে। আপনি আনুমানিক করতে হবেlog2(c) সীমার মধ্যে1≤c<2 ।
চিত্র 2. লগ 2 এর প্লট ( সি )log2(c)
আপনার সঠিকতা প্রয়োজনীয়তা, রৈখিক ক্ষেপক এবং অভিন্ন স্যাম্পলিং জন্য 214+1=16385 নমুনা log2(c) এবং 30×212+1=122881 নমুনা atan(2z) জন্য 0<z<30 চলা উচিত নয়। পরের টেবিলটি বেশ বড়। এটির সাথে, বিরতিজনিত কারণে ত্রুটি z উপর নির্ভর করে :
চিত্র 3. atan(2z) পড়তা বৃহত্তম বিভিন্ন ব্যাপ্তির জন্য পরম ত্রুটি z একক ব্যবধান প্রতি নমুনার বিভিন্ন সংখ্যা (8192 32) জন্য (অনুভূমিক অক্ষ) z । 0≤z<1 (বাদ দেওয়া) এর জন্য বৃহত্তম পরম ত্রুটি floor(log2(z))=0 চেয়ে কিছুটা কম ।
atan(2z) টেবিল একাধিক subtables বিভক্ত যে মিলা হতে পারে 0≤z<1 এবং বিভিন্ন floor(log2(z)) সঙ্গে z≥1 , যা ক্যালকুলেট করা সহজ। চিত্রের দ্বারা নির্দেশিত হিসাবে টেবিলের দৈর্ঘ্যগুলি চয়ন করা যেতে পারে 3.. অভ্যন্তরীণ-সাবটেবল সূচকটি একটি সাধারণ বিট স্ট্রিং ম্যানিপুলেশন দ্বারা গণনা করা যায়। আপনার সঠিকতা প্রয়োজনীয়তা জন্য atan(2z) subtables আপনি পরিসর প্রসারিত 29217 নমুনা মোট থাকবে z জন্য 0≤z<32 সরলতার জন্য।
পরবর্তী রেফারেন্সের জন্য, এখানে আঁকড়ে পাইথন স্ক্রিপ্টটি আমি আনুমানিক ত্রুটিগুলি গণনা করতে ব্যবহার করি:
from numpy import *
from math import *
N = 10
M = 20
x = array(range(N + 1))/double(N) + 1
y = empty(N + 1, double)
for i in range(N + 1):
y[i] = log(x[i], 2)
maxErr = 0
for i in range(N):
for j in range(M):
a = y[i] + (y[i + 1] - y[i])*j/M
if N*M < 1000:
print str((i*M + j)/double(N*M) + 1) + ' ' + str(a)
b = log((i*M + j)/double(N*M) + 1, 2)
err = abs(a - b)
if err > maxErr:
maxErr = err
print maxErr
y2 = empty(N + 1, double)
for i in range(1, N):
y2[i] = -1.0/16.0*y[i-1] + 9.0/8.0*y[i] - 1.0/16.0*y[i+1]
y2[0] = -1.0/16.0*log(-1.0/N + 1, 2) + 9.0/8.0*y[0] - 1.0/16.0*y[1]
y2[N] = -1.0/16.0*y[N-1] + 9.0/8.0*y[N] - 1.0/16.0*log((N+1.0)/N + 1, 2)
maxErr = 0
for i in range(N):
for j in range(M):
a = y2[i] + (y2[i + 1] - y2[i])*j/M
b = log((i*M + j)/double(N*M) + 1, 2)
if N*M < 1000:
print a
err = abs(a - b)
if err > maxErr:
maxErr = err
print maxErr
y2[0] = 15.0/16.0*y[0] + 1.0/8.0*y[1] - 1.0/16.0*y[2]
y2[N] = -1.0/16.0*y[N - 2] + 1.0/8.0*y[N - 1] + 15.0/16.0*y[N]
maxErr = 0
for i in range(N):
for j in range(M):
a = y2[i] + (y2[i + 1] - y2[i])*j/M
b = log((i*M + j)/double(N*M) + 1, 2)
if N*M < 1000:
print str(a) + ' ' + str(b)
err = abs(a - b)
if err > maxErr:
maxErr = err
print maxErr
P = 32
NN = 13
M = 8
for k in range(NN):
N = 2**k
x = array(range(N*P + 1))/double(N)
y = empty((N*P + 1, NN), double)
maxErr = zeros(P)
for i in range(N*P + 1):
y[i] = atan(2**x[i])
for i in range(N*P):
for j in range(M):
a = y[i] + (y[i + 1] - y[i])*j/M
b = atan(2**((i*M + j)/double(N*M)))
err = abs(a - b)
if (i*M + j > 0 and err > maxErr[int(i/N)]):
maxErr[int(i/N)] = err
print N
for i in range(P):
print str(i) + " " + str(maxErr[i])
একটি ফাংশন approximating থেকে স্থানীয় সর্বাধিক ত্রুটি f(x) সুসংগত প্রক্ষেপক দ্বারা চ ( এক্স ) নমুনা থেকে চ ( এক্স ) , স্যাম্পলিং ব্যবধান সঙ্গে অভিন্ন স্যাম্পলিং কর্তৃক গৃহীত Δ এক্স দ্বারা বিশ্লেষণী আনুমানিক করা যেতে পারে:f^(x)f(x)Δx
fˆ(x)−f(x)≈(Δx)2limΔx→0f(x)+f(x+Δx)2−f(x+Δx2)(Δx)2=(Δx)2f′′(x)8,
চ''( এক্স )চ( এক্স )এক্স
একটি কষাˆ( 2)z- র) - আতান ( 2 )z- র) ≈ ( Δ z ))22z- র( 1 - 4)z- র) ln( 2 )28 ( 4)z- র+ 1 )2,লগ2ˆ( ক ) - লগ2( ক ) ≈ - ( Δ ক )28 ক2Ln( 2 )।
কারণ ফাংশনগুলি অবতল এবং নমুনাগুলি ফাংশনের সাথে মেলে তাই ত্রুটিটি সর্বদা একদিকে থাকে। স্থানীয় সর্বাধিক পরম ত্রুটিটি অর্ধনমিত হতে পারে যদি ত্রুটির চিহ্নটি প্রতিটি নমুনা বিরতিতে একবার পিছনে পিছনে পিছনে করা যায়। রৈখিক সংক্ষিপ্তসার দ্বারা, প্রতিটি টেবিলে প্রিফিল্টার করে অনুকূল ফলাফলের কাছাকাছি হওয়া সম্ভব:
Y[ কে ] = ⎧⎩⎨⎪⎪খ2এক্স [ কে - ২ ]গ1এক্স [ কে - 1 ]+ খ1এক্স [ কে - 1 ]খ0এক্স [ কে ]+ গ0এক্স [ কে ]+ খ0x[k]+b1x[k+1]+c1x[k+1]+b2x[k+2]if k=0,if 0<k<N,if k=N,
xy0≤k≤Nc0=98,c1=−116,b0=1516,b1=18,b2=−116গ0, গ1এন
( Δ x )এনলিমΔ x → 0( গ1চ( x - Δ x ) + গ0চ( x ) + গ1চ( x + Δ x ) ) ( 1 - এ )+ ( গ1চ( x ) + গ0চ( x + Δ x ) + গ1চ( x + 2 Δ x ) ) এ - এফ( x + a Δ x )( Δ x )এন= ⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪( গ0+2c1−1)f(x)01+a−a2−c02(Δx)2f′′(x)if N=0,∣∣∣c1=1−c02if N=1,if N=2,∣∣∣c0=98
0≤a<1f(x)f(x)=exb0,b1,b2
(Δx)NlimΔx→0(b0f(x)+b1f(x+Δx)+b2f(x+2Δx))(1−a)+(c1f(x)+c0f(x+Δx)+c1f(x+2Δx))a−f(x+aΔx)(Δx)N=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪(b0+b1+b2−1+a(1−b0−b1−b2))f(x)(a−1)(2b0+b1−2)Δxf′(x)(−12a2+(2316−b0)a+b0−1)(Δx)2f′′(x)if N=0,∣∣∣b2=1−b0−b1if N=1,∣∣∣b1=2−2b0if N=2,∣∣∣b0=1516
0≤a<1
log2(a)
এই নিবন্ধটি সম্ভবত খুব অনুরূপ একটি অ্যালগোরিদম উপস্থাপন করেছে: আর। গুতেরেজ, ভি। টরেস এবং জে ভলস, " লগারিদমিক ট্রান্সফর্মেশন এবং লুট-ভিত্তিক কৌশলগুলির উপর ভিত্তি করে আতান (ওয়াই / এক্স) এর এফপিজিএ-বাস্তবায়ন, " সিস্টেমস আর্কিটেকচার জার্নাল , খণ্ড । ৫ 56, ২০১০. অ্যাবস্ট্রাক্ট বলছে যে তাদের বাস্তবায়ন পূর্বের কর্ডিক-ভিত্তিক অ্যালগরিদমগুলিকে গতিতে এবং LUT- ভিত্তিক অ্যালগোরিদমকে পদচিহ্ন আকারে পরাজিত করে।