পাই এখনও ভুল [বন্ধ]


27

পাই ভুল

পাই গণনা করার একটি সাধারণ পদ্ধতি হ'ল "ডার্টগুলি" একটি 1x1 বাক্সে ফেলে দেওয়া এবং মোট নিক্ষিপ্তের তুলনায় ইউনিট বৃত্তের কোন জমিটি দেখে:

loop
   x = rand()
   y = rand()
   if(sqrt(x*x + y*y) <= 1) n++
   t++
pi = 4.0*(n/t)

একটি প্রোগ্রাম যা লিখুন সৌন্দর্য এটা পছন্দ করা উচিত সঠিকভাবে কম্পিউট PI (এই বা কম্পিউটিং পাই এর অন্যান্য সাধারণ পদ্ধতি ব্যবহার করে) কিন্তু নির্ণয় টাও (টাও = 2 * পাই = 6,283185307179586 ...) পরিবর্তে। আপনার কোড অবশ্যই কমপক্ষে প্রথম 6 দশমিক স্থান উত্পাদন করতে হবে: 6.283185

বিজয়ীর 6th ই জুন (আজ থেকে এক সপ্তাহ) মুকুটযুক্ত।


43
২৮ শে জুন কেন বিজয়ীর মুকুট পরে না ??
কর্সিকা

9
আমি নিশ্চিত নই যে জনপ্রিয়তার প্রতিযোগিতায় কেন বিজয়ীর মুকুট লাগানো দরকার।
টিম এস

1
আমি পাই না। এটি এমন কোনও ফাংশন জিজ্ঞাসা করার মতো যা প্রত্যাবর্তন করে 1তবে ফিরে আসে 2। এখানে আমরা কাকে বোকা বানাচ্ছি?
j72 72

3
@ j72 কোডটির পাঠক :)
টেমসডিং

8
সকলেই জানেন যে পাৰ সঠিক । : পি
জাস্টিন ক্রেজচা

উত্তর:


57

জাভাস্ক্রিপ্ট

alert(Math.atan2(0, -0) - Math.atan2(-0, -0) + Math.atan2(0, 0))

সহায়তা, আমি একটি মহাবিশ্বের কারখানায় আটকা পড়েছি এবং আমি নিশ্চিত না যে আমি কী করছি। Math.atan2ভাল মান সহ পাই ফিরিয়ে দেওয়ার কথা, তাই না? Math.atan2(0, -0)পাই ফিরিয়ে দেয়, তাই আমি যদি এটি বিয়োগ করি এবং এটি যুক্ত করি তবে আমার পাই থাকা উচিত।


14
আমি মনে করি আমি শুয়ে আছি আর কাঁদব। গড্ডামনিট, জাভাস্ক্রিপ্ট।
জ্যাক এম

3
ব্যাখ্যা দয়া করে? :)
জা-সি

2
এক্স অক্ষ এবং বিন্দু (Y, এক্স) এর মধ্যে রেডিয়ানে পাল্টা ঘড়ির কাঁটা কোণ ওয়াই পয়েন্টের π - (-π)

8
0_o >>> 0 === -0 ;true ;>>> Math.atan2(0, 0) ;0 ;>>> Math.atan2(0, -0) ;3.141592653589793
ইজকাটা

5
@ জ্যাকএম, উক্তিটি সর্বদা বলা উপযুক্ত: :) যদিও এই ক্ষেত্রে এটি আইইইই স্ট্যান্ডার্ডের কারণে, এবং অনেক ভাষায় (কেবল জেএস নয়) শূন্য বনাম নেতিবাচক শূন্য সমস্যা রয়েছে।
পল ড্রাগন

40

বেসিক

(আরও সুনির্দিষ্টভাবে, চিপমঙ্ক বেসিক )

এটি 15 তম শতাব্দীতে নীলকণ্ঠ সোময়াজী দ্বারা আবিষ্কার করা একটি সীমাহীন সিরিজ ব্যবহার করেছে :

' Calculate pi using the Nilakantha series:
'               4       4       4       4
'  pi  =  3 + ----- - ----- + ----- - ------ + ...
'             2x3x4   4x5x6   6x7x8   8x9x10
i = pi = 0
numerator = -4
while i<10000
  i = i + 2
  numerator = -numerator
  pi = pi + numerator / (i * (i+1) * (i+2))
wend
pi = pi + 3
print using "#.##########";pi

আউটপুট

6.2831853072

কী চলছে তা যদি আপনি বুঝতে না পারেন তবে এখানে কয়েকটি ইঙ্গিত দেওয়া হয়েছে:

চিপমাংক বেসিক সালে পরিবর্তনশীল পাই যখন প্রোগ্রাম চলমান শুরু π এর মান প্রিসেট করা হয়।

এবং

বেসিকে, সমান চিহ্নটি ভেরিয়েবল বরাদ্দকরণ এবং সমতা পরীক্ষার জন্য উভয়ই ব্যবহৃত হয়। সুতরাং a = b = c কে a = (b == c) হিসাবে ব্যাখ্যা করা হয় ।


অপেক্ষা কর আমি পাই না, এত iসমান false? এবং তারপরে আপনি 2এটি যুক্ত করবেন? এবং এটি কাজ করে ???
ডুনো

2
@ ডন্নো: অবশ্যই, লুপগুলি শুরু হয় i == falseযা এর সাথে সমান i == 0pi
মুল বক্তব্যটি

1
@ বেরগি হ্যাঁ আমি এই সত্যটি প্রায় আমার মাথাটি গুটিয়ে রাখতে পারি না false + 2 == 2: ডি
ডুনো

@ ডুনো ডায়নামিক টাইপিং ইত্যাদি: গাণিতিক করার সময় মিথ্যা স্পষ্টভাবে 0 তে রূপান্তরিত হয়। সি তেও আপনার একই আপাত আচরণ রয়েছে যা একটি boolধরণের অভাব রয়েছে , এবং 0প্রতিনিধিত্ব করতে falseএবং trueপ্রতিবাদমূলকভাবে ব্যবহার করে এবং শূন্য নয়। এটি মার্জিত নয়, তবে ওহে, এটি কীভাবে কাজ করে।
সুজান ডুপোরন

15

সি - অর্ধ ইউনিট বৃত্তের দৈর্ঘ্য

ওয়ান ওয়ে গনা π কেবল দূরত্ব বিন্দু পরিমাপ হয় (1, 0)ভ্রমণ যখন প্রায় আবর্তিত উৎপত্তি থেকে (-1, 0)যেহেতু এটি একটি অর্ধেক পরিধি হতে হবে ইউনিট বৃত্ত (যা )।

এখানে চিত্র বর্ণনা লিখুন

যাইহোক, কোন sin(x)বা cos(x)এই যেহেতু প্রয়োজন হয় দ্বারা করা সম্ভব পদবিন্যাস প্রায় সব পথ উৎপত্তি এবং দূরত্ব বিন্দু প্রতিটি ধাপের জন্য ভ্রমণ যোগ । প্রতিটি ধাপের জন্য ছোট সাইজ আরো সঠিক π আপনি পাবেন।

দ্রষ্টব্য: যখন y শূন্যের নীচে থাকবে (যা এটি যেমন চলে তেমনই (-1, 0)) পদক্ষেপটি শেষ হবে ।

#include <stdio.h>                          // for printf
#define length(y, x) ((x * x) + (y * y))
int main()
{
    double x, y;
    double pi, tau, step;
    // start at (2, 0) which actually calculates tau
    x  = 2;
    y  = 0;
    // the step needs to be very low for high accuracy
    step = 0.00000001;  
    tau = 0;
    while (y >= 0)
    {   // the derivate of (x, y) is itself rotated 90 degrees
        double dx = -y;
        double dy = x;

        tau += length(dx, dy) * step; // add the distance for each step to tau
        // add the distance to the point (make a tiny rotation)
        x += dx * step;
        y += dy * step;
    }
    pi = tau / 2;   // divide tau with 2 to get pi

    /* ignore this line *\                      pi *= 2;    /* secret multiply ^-^ */

    // print the value of pi
    printf("Value of pi is %f", pi); getchar(); 
    return 0;
}

এটি নিম্নলিখিত আউটপুট দেয়:

Value of pi is 6.283185

3
দেখে মনে হচ্ছে ... অবশ্যই।
bjb568

1
আপনার lengthম্যাক্রো একটি স্কয়ার্ট অনুপস্থিত। এটা কি উদ্দেশ্য? xএবং yসংজ্ঞা এবং কলটির মধ্যেও অদলবদল হয় (কোনও প্রভাব ছাড়াই)
বেন ভয়েগট

পুনঃটুইট কৌশলটি খারাপ করবেন না, তবে হ্যাঁ। দুর্ঘটনাক্রমে বাদ দেওয়া sqrtহয়েছিল যাতে পাইটির মান 6,28 হিসাবে মুদ্রিত হয়েছিল ... এছাড়াও লক্ষ করার জন্য +1 এবং যা আমি করিনি! xy
2

1
ওহ, এখন আমি দেখতে পাচ্ছি আপনি একটি ইউনিট বৃত্তটি ট্রেস করছেন না, তবে ব্যাসার্ধ 2 সহ একটি Y হ্যাঁ, এটি দুর্দান্ত কাজ করে।
বেন ভয়েগ্ট

7
আমাকে অবশ্যই স্বীকার করতে হবে যে এটি কীভাবে কাজ করে তা বোঝার আগে আমি এই লাইনটি উপেক্ষা না করে কয়েক মিনিট নষ্ট করেছি ...
লরেব

10

সি

(এটি শেষের চেয়ে বেশি দীর্ঘ হওয়া শেষ হয়েছে তবে আমি এটি যাইহোক পোস্ট করব ...)

17 শতকে ওয়ালিস পাইয়ের জন্য একটি অসীম সিরিজ প্রকাশ করেছিলেন:

এখানে চিত্র বর্ণনা লিখুন

(আরও তথ্যের জন্য নতুন ওয়ালিস- এবং ক্যাটালান-প্রকারের অসীম পণ্যগুলি দেখুন ), e, এবং 2 (2 + √2 )

এখন, পাই গণনা করার জন্য, ডিনোমিনেটরটি বের করার জন্য আমাদের প্রথমে দুটি দিয়ে গুণ করতে হবে:

এখানে চিত্র বর্ণনা লিখুন

আমার সমাধানটি পরে পাই / 2 এবং দুইটির জন্য অসীম সিরিজ গণনা করে এবং তারপর দুটি মান একসাথে গুণ করে। নোট করুন যে চূড়ান্ত মানগুলি গণনা করার সময় অসীম পণ্যগুলি রূপান্তর করতে অবিশ্বাস্যভাবে ধীর হয়।

আউটপুট:

pi: 6.283182
#include "stdio.h"
#include "stdint.h"

#define ITERATIONS 10000000
#define one 1

#define IEEE_MANTISSA_MASK 0xFFFFFFFFFFFFFULL

#define IEEE_EXPONENT_POSITION 52
#define IEEE_EXPONENT_BIAS 1023

// want to get an exact as possible result, so convert
// to integers and do custom 64-bit multiplication.
double multiply(double aa, double bb)
{
    // the input values will be between 1.0 and 2.0
    // so drop these to less than 1.0 so as not to deal 
    // with the double exponents.
    aa /= 2;
    bb /= 2;

    // extract fractional part of double, ignoring exponent and sign
    uint64_t a = *(uint64_t*)&aa & IEEE_MANTISSA_MASK;
    uint64_t b = *(uint64_t*)&bb & IEEE_MANTISSA_MASK;

    uint64_t result = 0x0ULL;

    // multiplying two 64-bit numbers is a little tricky, this is done in two parts,
    // taking the upper 32 bits of each number and multiplying them, then
    // then doing the same for the lower 32 bits.
    uint64_t a_lsb = (a & 0xFFFFFFFFUL);
    uint64_t b_lsb = (b & 0xFFFFFFFFUL);

    uint64_t a_msb = ((a >> 32) & 0xFFFFFFFFUL);
    uint64_t b_msb = ((b >> 32) & 0xFFFFFFFFUL);

    uint64_t lsb_result = 0;
    uint64_t msb_result = 0;

    // very helpful link explaining how to multiply two integers
    // http://stackoverflow.com/questions/4456442/interview-multiplication-of-2-integers-using-bitwise-operators
    while(b_lsb != 0)
    {
        if (b_lsb & 01)
        {
            lsb_result = lsb_result + a_lsb;
        }
        a_lsb <<= 1;
        b_lsb >>= 1;
    }
    while(b_msb != 0)
    {
        if (b_msb & 01)
        {
            msb_result = msb_result + a_msb;
        }
        a_msb <<= 1;
        b_msb >>= 1;
    }

    // find the bit position of the most significant bit in the higher 32-bit product (msb_answer)
    uint64_t x2 = msb_result;
    int bit_pos = 0;
    while (x2 >>= 1)
    {
        bit_pos++;
    }

    // stuff bits from the upper 32-bit product into the result, starting at bit 51 (MSB of mantissa)
    int result_position = IEEE_EXPONENT_POSITION - 1;
    for(;result_position > 0 && bit_pos > 0; result_position--, bit_pos--)
    {
        result |= ((msb_result >> bit_pos) & 0x01) << result_position;
    }

    // find the bit position of the most significant bit in the lower 32-bit product (lsb_answer)
    x2 = lsb_result;
    bit_pos = 0;
    while (x2 >>= 1)
    {
        bit_pos++;
    }

    // stuff bits from the lowre 32-bit product into the result, starting at whatever position
    // left off at from above.
    for(;result_position > 0 && bit_pos > 0; result_position--, bit_pos--)
    {
        result |= ((lsb_result >> bit_pos) & 0x01) << result_position;
    }

    // create hex representation of the answer
    uint64_t r = (uint64_t)(/* exponent */ (uint64_t)IEEE_EXPONENT_BIAS << IEEE_EXPONENT_POSITION) |
            (uint64_t)( /* fraction */ (uint64_t)result & IEEE_MANTISSA_MASK);

    // stuff hex into double
    double d = *(double*)&r;

    // since the two input values were divided by two,
    // need to multiply by four to fix the result.
    d *= 4;

   return d;
}

int main()
{
    double pi_over_two = one;
    double two = one;

    double num = one + one;
    double dem = one;

    int i=0;

    i=ITERATIONS;
    while(i--)
    {
        // pi = 2 2 4 4 6 6 8 8 ...
        // 2    1 3 3 5 5 7 7 9
        pi_over_two *= num / dem;

        dem += one + one;

        pi_over_two *= num / dem;

        num += one + one;
    }

    num = one + one;
    dem = one;

    i=ITERATIONS;
    while(i--)
    {
        // 2 = 2 4 4 6   10 12 12 14
        //     1 3 5 7    9 11 13 15
        two *= num / dem;

        dem += one + one;
        num += one + one;

        two *= num / dem;

        dem += one + one;

        two *= num / dem;

        dem += one + one;
        num += one + one;

        two *= num / dem;

        dem += one + one;
        num += one + one + one + one;
    }

    printf("pi: %f\n", multiply(pi_over_two, two));

    return 0;
}

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


8

জাভা - নীলকণ্ঠ সিরিজ

নীলকণ্ঠ সিরিজটি দেওয়া হল:

pi = 3 + 4/(2*3*4) - 4/(4*5*6) + 4/(6*7*8) - 4/(8*9*10) ...

সুতরাং প্রতিটি টার্মের জন্য, ডিনোমিনেটরটি প্রতিটি টার্ম 2 দিয়ে শুরু করে ক্রমাগত পূর্ণসংখ্যার গুণক দ্বারা নির্মিত হয়। লক্ষ্য করুন যে আপনি বিকল্প শর্তাদি যুক্ত / বিয়োগ করেন।

public class NilakanthaPi {
    public static void main(String[] args) {
        double pi = 0;
        // five hundred terms
        for(int t=1;t<500;t++){
            // each i is 2*term
            int i=t*2;
            double part = 4.0 / ((i*i*t)+(3*i*t)+(2*t));
            // flip sign for alternating terms
            if(t%2==0)
                pi -= part;
            else
                pi += part;
            // add 3 for first term
            if(t<=2)
                pi += 3;
        }
        System.out.println(pi);
    }
}

পাঁচশো শর্ত পরে, আমরা পাই এর একটি যুক্তিসঙ্গত অনুমান পাই:

6.283185311179568

4

সি ++: সঙ্গমগ্রমের মাধব

এই অসীম সিরিজটি এখন মাধব-লাইবনিজ নামে পরিচিত :

ক্রম

48 এর বর্গমূল দিয়ে শুরু করুন এবং এটি (-3) -k / (2k + 1) এর যোগফলের দ্বারা গুণ করুন । কার্যকর করার জন্য খুব সোজা এবং সহজ:

long double findPi(int iterations)
{
    long double value = 0.0;

    for (int i = 0; i < iterations; i++) {
        value += powl(-3.0, -i) / (2 * i + 1);
    }

    return sqrtl(48.0) * value;
}

int main(int argc, char* argv[])
{
    std::cout << "my pi: " << std::setprecision(16) << findPi(1000) << std::endl;

    return 0;
}

আউটপুট:

my pi: 6.283185307179588

3

পাইথন - নীলকণ্ঠ সিরিজের বিকল্প

পাইটি গণনা করার জন্য এটি আর একটি অনন্ত সিরিজ যা বুঝতে মোটামুটি সহজ।

এখানে চিত্র বর্ণনা লিখুন

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

pi = 6
sign = 1
for t in range(1,500):
i = t+1
   part = 2.0 / (i*t*(i+t))
   pi = pi + sign * part
   sign = - sign # flip sign for alternating terms  
print(pi)

যা 6.283185 দেয়।


-1
#include "Math.h"
#include <iostream>
int main(){
    std::cout<<PI;
    return 0;
}

math.h:

#include <Math.h>
#undef PI
#define PI 6.28

আউটপুট: 6.28

# অন্তর্ভুক্ত "ম্যাথ এইচ" # অন্তর্ভুক্তের মতো নয়, তবে কেবল মূল ফাইলটি দেখে, প্রায় কেউই পরীক্ষা করে দেখার চিন্তা করবে না। সম্ভবত স্পষ্টতই, তবে একই প্রকল্পে আমি কাজ করছি এমন একটি প্রকল্পে হাজির হয়েছিল, এবং দীর্ঘদিন ধরে সনাক্ত করা যায়নি।


তবুও একটি চতুর সমাধান।
বব দ্য আশ্চর্য
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.