লগ (এক্স) এর দ্রুত সান্নিধ্য সম্পর্কে


10

আমি কিছুক্ষণ আগে একটি কোড লিখেছিলাম যা লাইব্রেরির ফাংশন ব্যবহার না করেই গণনা করার চেষ্টা করেছিল । গতকাল, আমি পুরানো কোডটি পর্যালোচনা করছিলাম, এবং আমি এটি যথাসম্ভব দ্রুত করার চেষ্টা করেছি (এবং সঠিক)। এখানে এখন পর্যন্ত আমার প্রচেষ্টা:log(x)

const double ee = exp(1);

double series_ln_taylor(double n){ /* n = e^a * b, where a is an non-negative integer */
    double lgVal = 0, term, now;
    int i, flag = 1;

    if ( n <= 0 ) return 1e-300;
    if ( n * ee < 1 )
        n = 1.0 / n, flag = -1; /* for extremely small n, use e^-x = 1/n */

    for ( term = 1; term < n ; term *= ee, lgVal++ );
    n /= term;

    /* log(1 - x) = -x - x**2/2 - x**3/3... */
    n = 1 - n;
    now = term = n;
    for ( i = 1 ; ; ){
        lgVal -= now;
        term *= n;
        now = term / ++i;
        if ( now < 1e-17 ) break;
    }

    if ( flag == -1 ) lgVal = -lgVal;

    return lgVal;
}

এখানে আমি এমন করার চেষ্টা করছি যাতে কেবলমাত্র এন এর উপরে, এবং তারপরে আমি n এর লগারিদম মান যুক্ত করবaeanealog(1  x)

আমি সম্প্রতি সংখ্যার বিশ্লেষণে আগ্রহ বাড়িয়েছি এবং সে কারণেই আমি এই প্রশ্নটি জিজ্ঞাসা করতে সহায়তা করতে পারি না, যথেষ্ট সংখ্যক সঠিক হওয়ার পরেও এই কোড বিভাগটি অনুশীলনে কতটা দ্রুত চালানো যেতে পারে? আমার কি অন্য কিছু পদ্ধতিতে স্যুইচ করা দরকার, উদাহরণস্বরূপ, এভাবে চালিয়ে যাওয়া ভগ্নাংশ ব্যবহার করে ?

log(x)

আপডেট 1 : উইকিপিডিয়ায় উল্লিখিত হাইপারবোলিক আর্টিকান সিরিজটি ব্যবহার করে, গণনাটি সি স্ট্যান্ডার্ড লাইব্রেরি লগ ফাংশনের চেয়ে প্রায় 2.2 গুণ ধীর বলে মনে হচ্ছে। যদিও, আমি কার্যকারিতাটি ব্যাপকভাবে পরীক্ষা করে দেখিনি, এবং বৃহত্তর সংখ্যার জন্য, আমার বর্তমান বাস্তবায়ন সত্যিই ধীর বলে মনে হচ্ছে। আমি যদি পরিচালনা করতে পারি তবে বিস্তৃত সংখ্যার জন্য ত্রুটিযুক্ত এবং গড় সময়ের জন্য আমার বাস্তবায়ন দুটিই পরীক্ষা করতে চাই। এখানে আমার দ্বিতীয় প্রচেষ্টা।

double series_ln_arctanh(double n){ /* n = e^a * b, where a is an non-negative integer */
    double lgVal = 0, term, now, sm;
    int i, flag = 1;

    if ( n <= 0 ) return 1e-300;
    if ( n * ee < 1 ) n = 1.0 / n, flag = -1; /* for extremely small n, use e^-x = 1/n */

    for ( term = 1; term < n ; term *= ee, lgVal++ );
    n /= term;

    /* log(x) = 2 arctanh((x-1)/(x+1)) */
    n = (1 - n)/(n + 1);

    now = term = n;
    n *= n;
    sm = 0;
    for ( i = 3 ; ; i += 2 ){
        sm += now;
        term *= n;
        now = term / i;
       if ( now < 1e-17 ) break;
    }

    lgVal -= 2*sm;

    if ( flag == -1 ) lgVal = -lgVal;
    return lgVal;
}

কোন পরামর্শ বা সমালোচনা প্রশংসা করা হয়।

1e81e3084e15

double series_ln_better(double n){ /* n = e^a * b, where a is an non-negative integer */
    double lgVal = 0, term, now, sm;
    int i, flag = 1;

    if ( n == 0 ) return -1./0.; /* -inf */
    if ( n < 0 ) return 0./0.;   /* NaN*/
    if ( n < 1 ) n = 1.0 / n, flag = -1; /* for extremely small n, use e^-x = 1/n */

    /* the cutoff iteration is 650, as over e**650, term multiplication would
       overflow. For larger numbers, the loop dominates the arctanh approximation
       loop (with having 13-15 iterations on average for tested numbers so far */

    for ( term = 1; term < n && lgVal < 650 ; term *= ee, lgVal++ );
    if ( lgVal == 650 ){
        n /= term;
        for ( term = 1 ; term < n ; term *= ee, lgVal++ );
    }
    n /= term;

    /* log(x) = 2 arctanh((x-1)/(x+1)) */
    n = (1 - n)/(n + 1);

    now = term = n;
    n *= n;
    sm = 0;

    /* limiting the iteration for worst case scenario, maximum 24 iteration */
    for ( i = 3 ; i < 50 ; i += 2 ){
        sm += now;
        term *= n;
        now = term / i;
        if ( now < 1e-17 ) break;
    }

    lgVal -= 2*sm;

    if ( flag == -1 ) lgVal = -lgVal;

    return lgVal;
}

উত্তর:


17

এই সত্যিই একটি নয় প্রামাণিক জবাব, আরো সমস্যা একটি তালিকা আমি মনে করি আপনি বিবেচনা করা উচিত, এবং আমি আপনার কোড পরীক্ষা করা হয়েছে।

log2.15.1

f(x)doublen12

n1.7976e+308term=infn=11017nterm *= e709.78266108405500745

1030000

আমি সন্দেহ করি যে অল্প চেষ্টা করে আপনি পারফরম্যান্সের জন্য সেই দৃust়তার কিছুটা উত্সর্গ করতে পারেন, উদাহরণস্বরূপ, যুক্তির পরিসর সীমাবদ্ধ করে বা কিছুটা কম সঠিক ফলাফল ফিরে।

৩. এই জাতীয় কোডের পারফরম্যান্স যে সিপিইউ আর্কিটেকচারটিতে চলছে তার উপর অনেক নির্ভর করে। এটি একটি গভীর এবং জড়িত বিষয়, তবে সিপিইউ নির্মাতারা ইন্টেলের মতো অপ্টিমাইজেশান গাইড প্রকাশ করে যা আপনার কোড এবং এটিতে যে সিপিইউ চলছে তার মধ্যে পৃথক মিথস্ক্রিয়া ব্যাখ্যা করে। ক্যাচিং তুলনামূলকভাবে সহজবোধ্য হতে পারে, তবে শাখার পূর্বাভাস, নির্দেশ-স্তরের সমান্তরালতা এবং ডেটা নির্ভরতার কারণে পাইপলাইন স্টলের মতো জিনিসগুলি উচ্চ-স্তরের কোডগুলিতে সুনির্দিষ্টভাবে দেখা মুশকিল, তবে পারফরম্যান্সের জন্য অনেক কিছুই গুরুত্বপূর্ণ।

x~y~=f~(x~)y=f(x~)সঠিক?)। এটি ভাসমান-পয়েন্ট রাউন্ডঅফ ত্রুটির উপস্থিতির কারণে টেলর সিরিজটি রূপান্তরিত করে দেখানোর মতো নয়।

4.5। নির্ভুলতার জন্য একটি অনির্ধারিত ফাংশনটি পরীক্ষা করার একটি ভাল উপায় হ'ল চার বিলিয়নের প্রত্যেকটিতে এটি মূল্যায়ন করা (আপনি যেমন যুক্তি হ্রাসটি সঠিকভাবে করছেন তবে এখানে) একক-নির্ভুলতা ভাসমান এবং এ থেকে স্ট্যান্ডার্ড লগের সাথে ত্রুটিগুলি তুলনা করে libm। কিছুটা সময় নেয় তবে কমপক্ষে এটি সম্পূর্ণ thorough

৫. যেহেতু আপনি প্রথম থেকেই ডাবলসের নির্ভুলতা জানেন, আপনার কাছে একটি আনবাউন্ডেড লুপ থাকতে হবে না: পুনরাবৃত্তির সংখ্যাটি সামনে বের করা যায় (এটি সম্ভবত প্রায় 50)। আপনার কোড থেকে শাখাগুলি সরাতে এটি ব্যবহার করুন বা কমপক্ষে পূর্বে পুনরাবৃত্তির সংখ্যা নির্ধারণ করুন।

লুপ আন্রোলিং সম্পর্কিত সমস্ত স্বাভাবিক ধারণাগুলিও প্রযোজ্য।

Tay . টেলর সিরিজ ব্যতীত আনুমানিক কৌশলগুলি ব্যবহার করা সম্ভব। এছাড়াও চেবিশেভ সিরিজ (ক্লেনশো পুনরাবৃত্তির সাথে), প্যাড আনুমানিক এবং কখনও কখনও নিউটনের পদ্ধতির মতো রুট সন্ধানের পদ্ধতিগুলি যখনই আপনার ফাংশনটিকে একটি সহজ ফাংশনের মূল হিসাবে পুনঃনির্মাণ করা যায় (যেমন, বিখ্যাত স্ক্র্যাট ট্রিক )।

অবিরত ভগ্নাংশগুলি সম্ভবত খুব দুর্দান্ত হবে না, কারণ এগুলি বিভাগে জড়িত, যা গুণক / যোগগুলির চেয়ে অনেক বেশি ব্যয়বহুল। আপনি তাকান তাহলে _mm_div_sshttps://software.intel.com/sites/landingpage/IntrinsicsGuide/ , বিভাজন 3-5 / 0.5-1 সঙ্গে তুলনা 13-14 চক্র এবং 5-14 এর থ্রুপুট লেটেন্সি আছে, আর্কিটেকচারের উপর নির্ভর করে, গুন / অ্যাড / ম্যাডের জন্য। সুতরাং সাধারণভাবে (সর্বদা নয়) যতটা সম্ভব বিভাগগুলি অপসারণ করার চেষ্টা করা বোধগম্য।

দুর্ভাগ্যক্রমে, গণিত এখানে এত বড় গাইড নয়, কারণ সংক্ষিপ্ত সূত্রযুক্ত অভিব্যক্তিগুলি দ্রুত গতিতে নয়। গণিত উদাহরণস্বরূপ বিভাগকে শাস্তি দেয় না।

Flo . ফ্লোটিং-পয়েন্ট নম্বরগুলি আকারে অভ্যন্তরীণভাবে সংরক্ষণ করা হয়x=m×2em12<m1exfrexp

8. আপনার তুলনা logসঙ্গে logমধ্যে libmবা openlibm(: যেমন https://github.com/JuliaLang/openlibm/blob/master/src/e_log.c )। অন্যান্য লোকেরা ইতিমধ্যে কী বের করেছে তা সন্ধান করার এটি সহজতম উপায়। এছাড়াও libm সিপিইউ নির্মাতাদের জন্য নির্দিষ্ট সংস্করণের বিশেষত-অনুকূলিতকরণ রয়েছে , তবে সাধারণত তাদের উত্স কোড প্রকাশিত হয় না।

বুস্ট :: এসএফ এর কিছু বিশেষ ফাংশন রয়েছে তবে এটি বেসিক নয়। লগ 1 পি এর উত্সটি দেখার জন্য এটি শিক্ষণীয় হতে পারে, যদিও: http://www.boost.org/doc/libs/1_58_0/libs/math/doc/html/math_toolkit/powers/log1p.html

এমপিএফআর এর মতো ওপেন-সোর্স স্বেচ্ছাচারিতা-নির্ভুলতা পাটিগণিত গ্রন্থাগারগুলিও রয়েছে, যা উচ্চতর নির্ভুলতার প্রয়োজনের কারণে লিবিমের চেয়ে বিভিন্ন অ্যালগরিদম ব্যবহার করতে পারে।

৯. হিঙ্গামের যথাযথতা এবং সংখ্যাগত অ্যালগোরিদমের স্থায়িত্ব সংখ্যাসূচক অ্যালগরিদমের ত্রুটি বিশ্লেষণের জন্য একটি ভাল উচ্চ-স্তরের ভূমিকা। আনুষঙ্গিকতা অ্যালগরিদমগুলি নিজেদের জন্য, ট্রেফথেন দ্বারা অনুমানের তত্ত্ব অনুমান অনুশীলনটি একটি ভাল রেফারেন্স।

১০. আমি জানি এটি প্রায়শই প্রায়শই বলা হয়, তবে যুক্তিসঙ্গতভাবে বড় সফ্টওয়্যার প্রকল্পগুলি খুব কমই একটি ছোট ফাংশনকে বারবার বলা হওয়ার রানটাইমের উপর নির্ভর করে। লগের পারফরম্যান্স সম্পর্কে চিন্তিত হওয়া এত সাধারণ বিষয় নয় , যদি না আপনি নিজের প্রোগ্রামটি প্রোফাইল করেন এবং তা নিশ্চিত করে থাকেন যে এটি গুরুত্বপূর্ণ।


26414e15

1.13e13term

 1e8

1
k=11071lnk

2
frexp x=m×2elnx=eln2+lnm

5

কিরিলের উত্তর ইতিমধ্যে বিপুল সংখ্যক প্রাসঙ্গিক বিষয়ে স্পর্শ করেছে। আমি ব্যবহারিক গণিত লাইব্রেরি ডিজাইনের অভিজ্ঞতার ভিত্তিতে তাদের কয়েকটিতে প্রসারিত করতে চাই। সামনে একটি নোট: গণিত গ্রন্থাগার ডিজাইনারদের প্রতিটি প্রকাশিত অ্যালগরিদমিক অপ্টিমাইজেশান, পাশাপাশি অনেকগুলি মেশিন নির্দিষ্ট অপ্টিমাইজেশান ব্যবহার করার ঝোঁক রয়েছে, সেগুলি সব প্রকাশিত হবে না। কোডটি প্রায়শই সংকলিত কোড ব্যবহার না করে সমাবেশ ভাষায় লেখা হবে। সুতরাং এটি অসম্ভাব্য যে একটি সরল ও সংকলিত বাস্তবায়ন অভিন্ন বৈশিষ্ট্য সেট (যথাযথতা, বিশেষ কেসগুলি পরিচালনা, ত্রুটি প্রতিবেদন, রাউন্ডিং-মোড সমর্থন) ধরে ধরে একটি বিদ্যমান উচ্চ-মানের গণিত গ্রন্থাগার বাস্তবায়নের 75% এরও বেশি কার্যকারিতা অর্জন করবে।

explogerfcΓ

নির্ভুলতার সাধারণত একটি (তৃতীয় পক্ষ) উচ্চ-নির্ভুলতার উল্লেখের সাথে তুলনা করে মূল্যায়ন করা হয়। একক যুক্তি একক নির্ভুলতা ফাংশন সহজেই নিখরচায় পরীক্ষা করা যেতে পারে, অন্যান্য ফাংশনগুলির জন্য (নির্দেশিত) এলোমেলো পরীক্ষার ভেক্টরগুলির সাথে পরীক্ষা করা প্রয়োজন। স্পষ্টতই কেউ সুনির্দিষ্টভাবে নির্ভুল রেফারেন্স ফলাফলগুলি গণনা করতে পারে না, তবে সারণী প্রস্তুতকারকের দ্বিধায় গবেষণা থেকে জানা যায় যে অনেকগুলি সাধারণ কার্যের জন্য লক্ষ্য সূক্ষ্মতার প্রায় তিনগুণ নির্ভুলতার সাথে একটি রেফারেন্স গণনা করা যথেষ্ট। উদাহরণস্বরূপ দেখুন:

ভিনসেন্ট লেফভ্রে, জিন-মিশেল মুলার, "ডাবল যথার্থতার মধ্যে প্রাথমিক কার্যাদি সঠিক করে দেওয়ার জন্য সবচেয়ে খারাপ মামলা" " ইন কম্পিউটার পাটিগণিত উপর প্রসিডিংস 15th আইইইই সিম্পোজিয়াম , 2001,111-118)। (অনলাইন প্রিপ্রিন্ট)

পারফরম্যান্সের ক্ষেত্রে, একজনকে বিলম্বের জন্য অনুকূলকরণ (গুরুত্বপূর্ণ যখন কেউ নির্ভরশীল ক্রিয়াকলাপের সময় নির্ধারণের সময় দেখেন), থ্রুপুট (স্বতন্ত্র ক্রিয়াকলাপ কার্যকর করার সময় বিবেচনা করার সময় প্রাসঙ্গিক) জন্য অনুকূলকরণের মধ্যে পার্থক্য করতে হয়। গত বিশ বছরে, হার্ডওয়্যার প্যারালালাইজেশন কৌশলগুলির বিস্তার যেমন নির্দেশের স্তরের সমান্তরালতা (যেমন সুপারসালার, অফ-অর্ডার প্রসেসর), ডেটা-স্তরের সমান্তরালতা (যেমন সিমডি নির্দেশিকা), এবং থ্রেড-স্তরের সমান্তরালতা (যেমন হাইপার-থ্রেডিং, মাল্টি-কোর প্রসেসর) আরও প্রাসঙ্গিক মেট্রিক হিসাবে কম্পিউটেশনাল থ্রুপুট উপর জোর দেয়।

log(1+x)=p(x)log(x)=2atanh((x1)/(x+1))=p(((x1)/(x+1))2)p

ফিউজড মাল্টিপল-অ্যাড অপারেশন ( এফএমএ ), যা প্রথম 25 বছর আগে আইবিএম দ্বারা প্রবর্তিত হয়েছিল, এবং এখন সমস্ত বড় প্রসেসরের আর্কিটেকচারে উপলভ্য, এটি আধুনিক গণিত গ্রন্থাগার বাস্তবায়নের একটি গুরুত্বপূর্ণ বিল্ডিং ব্লক। এটি রাউন্ডিং ত্রুটি হ্রাস সরবরাহ করে, বিয়োগমূলক বাতিলকরণের বিরুদ্ধে সীমিত সুরক্ষা দেয় এবং ডাবল-ডাবল পাটিগণিতকে ব্যাপকভাবে সরল করে ।

C99log()C99fma()233

#include <math.h>

/* compute natural logarithm

   USE_ATANH == 1: maximum error found: 0.83482 ulp @ 0.7012829191167614
   USE_ATANH == 0: maximum error found: 0.83839 ulp @ 1.2788954397331760
*/
double my_log (double a)
{
    const double LOG2_HI = 0x1.62e42fefa39efp-01; // 6.9314718055994529e-01
    const double LOG2_LO = 0x1.abc9e3b39803fp-56; // 2.3190468138462996e-17
    double m, r, i, s, t, p, f, q;
    int e;

    m = frexp (a, &e);
    if (m < 0.70703125) { // 181/256
        m = m + m;
        e = e - 1;
    }
    i = (double)e;

    /* m in [181/256, 362/256] */

#if USE_ATANH
    /* Compute q = (m-1) / (m+1) */
    p = m + 1.0;
    m = m - 1.0;
    q = m / p;

    /* Compute (2*atanh(q)/q-2*q) as p(q**2), q in [-75/437, 53/309] */
    s = q * q;
    r =             0x1.2f1da230fb057p-3;  // 1.4800574027992994e-1
    r = fma (r, s,  0x1.399f73f934c01p-3); // 1.5313616375223663e-1
    r = fma (r, s,  0x1.7466542530accp-3); // 1.8183580149169243e-1
    r = fma (r, s,  0x1.c71c51a8bf129p-3); // 2.2222198291991305e-1
    r = fma (r, s,  0x1.249249425f140p-2); // 2.8571428744887228e-1
    r = fma (r, s,  0x1.999999997f6abp-2); // 3.9999999999404662e-1
    r = fma (r, s,  0x1.5555555555593p-1); // 6.6666666666667351e-1
    r = r * s;

    /* log(a) = 2*atanh(q) + i*log(2) = LOG2_LO*i + p(q**2)*q + 2q + LOG2_HI*i.
       Use K.C. Ng's trick to improve the accuracy of the computation, like so:
       p(q**2)*q + 2q = p(q**2)*q + q*t - t + m, where t = m**2/2.
    */
    t = m * m * 0.5;
    r = fma (q, t, fma (q, r, LOG2_LO * i)) - t + m;
    r = fma (LOG2_HI, i, r);

#else // USE_ATANH

    /* Compute f = m -1 */
    f = m - 1.0;
    s = f * f;

    /* Approximate log1p (f), f in [-75/256, 106/256] */
    r = fma (-0x1.961d64ddd82b6p-6, f, 0x1.d35fd598b1362p-5); // -2.4787281515616676e-2, 5.7052533321928292e-2
    t = fma (-0x1.fcf5138885121p-5, f, 0x1.b97114751d726p-5); // -6.2128580237329929e-2, 5.3886928516403906e-2
    r = fma (r, s, t);
    r = fma (r, f, -0x1.b5b505410388dp-5); // -5.3431043874398211e-2
    r = fma (r, f,  0x1.dd660c0bd22dap-5); //  5.8276198890387668e-2
    r = fma (r, f, -0x1.00bda5ecdad6fp-4); // -6.2680862565391612e-2
    r = fma (r, f,  0x1.1159b2e3bd0dap-4); //  6.6735934054864471e-2
    r = fma (r, f, -0x1.2489f14dd8883p-4); // -7.1420614809115476e-2
    r = fma (r, f,  0x1.3b0ee248a0ccfp-4); //  7.6918491287915489e-2
    r = fma (r, f, -0x1.55557d3b497c3p-4); // -8.3333481965921982e-2
    r = fma (r, f,  0x1.745d4666f7f48p-4); //  9.0909266480136641e-2
    r = fma (r, f, -0x1.999999d959743p-4); // -1.0000000092767629e-1
    r = fma (r, f,  0x1.c71c70bbce7c2p-4); //  1.1111110722131826e-1
    r = fma (r, f, -0x1.fffffffa61619p-4); // -1.2499999991822398e-1
    r = fma (r, f,  0x1.249249262c6cdp-3); //  1.4285714290377030e-1
    r = fma (r, f, -0x1.555555555f03cp-3); // -1.6666666666776730e-1
    r = fma (r, f,  0x1.999999999759ep-3); //  1.9999999999974433e-1
    r = fma (r, f, -0x1.fffffffffff53p-3); // -2.4999999999999520e-1
    r = fma (r, f,  0x1.555555555555dp-2); //  3.3333333333333376e-1
    r = fma (r, f, -0x1.0000000000000p-1); // -5.0000000000000000e-1

    /* log(a) = log1p (f) + i * log(2) */
    p = fma ( LOG2_HI, i, f);
    t = fma (-LOG2_HI, i, p);
    f = fma ( LOG2_LO, i, f - t);
    r = fma (r, s, f);
    r = r + p;
#endif // USE_ATANH

    /* Handle special cases */
    if (!((a > 0.0) && (a <= 0x1.fffffffffffffp1023))) {
        r = a + a;  // handle inputs of NaN, +Inf
        if (a  < 0.0) r =  0.0 / 0.0; //  NaN
        if (a == 0.0) r = -1.0 / 0.0; // -Inf
    }
    return r;
}

(+1) আপনি কি জানেন যে সাধারণ ওপেনসোর্স বাস্তবায়নগুলি (ওপেনলিবিমের মতো) যতটা পারে ঠিক তত ভাল হয়, বা তাদের বিশেষ ক্রিয়াকলাপগুলি আরও উন্নত করা যায়?
কিরিল

1
@ কিরিল সর্বশেষ আমি ওপেন সোর্স বাস্তবায়নগুলি দেখেছি (বহু বছর আগে), তারা এফএমএর সুবিধাগুলি কাজে লাগাচ্ছে না। সেই সময় আইবিএম পাওয়ার এবং ইন্টেল ইটানিয়াম একমাত্র আর্কিটেকচার ছিল যার মধ্যে অপারেশন অন্তর্ভুক্ত ছিল, এখন এটির জন্য হার্ডওয়্যার সমর্থন সর্বব্যাপী। এছাড়াও, টেবিল-প্লাস-বহু-বহির্ভুত অনুমানগুলি তখনকার শিল্পের রাজ্য ছিল, এখন টেবিলগুলি অনুকূল নয়: উচ্চতর শক্তি ব্যবহারে মেমরির অ্যাক্সেসের ফলাফল, তারা ভেক্টরাইজেশনে হস্তক্ষেপ করতে পারে (এবং করতে পারে), এবং কম্পিউটেশনাল থ্রুপুট মেমরি থ্রুপুটের চেয়ে বেশি বৃদ্ধি পেয়েছে টেবিলগুলি থেকে সম্ভাব্য নেতিবাচক কর্মক্ষমতা প্রভাবের ফলে।
njuffa
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.