0.0 এবং 1.0 এর মধ্যে কতটি দ্বিগুণ সংখ্যা রয়েছে?


95

এটি এমন কিছু যা আমার মনে বছরের পর বছর ধরে ছিল তবে আমি আগে জিজ্ঞাসা করার জন্য কখনই সময় নিই নি।

অনেকগুলি (সিউডো) এলোমেলো সংখ্যা জেনারেটর 0.0 এবং 1.0 এর মধ্যে একটি এলোমেলো সংখ্যা তৈরি করে। গাণিতিকভাবে এই ব্যাপ্তিতে অসীম সংখ্যা রয়েছে তবে doubleএটি একটি ভাসমান পয়েন্ট সংখ্যা এবং তাই একটি সীমাবদ্ধ নির্ভুলতা রয়েছে।

সুতরাং প্রশ্নগুলি হ'ল:

  1. double0.0 এবং 1.0 এর মধ্যে কতটি সংখ্যা রয়েছে?
  2. 1 এবং 2 এর মধ্যে কেবল এতগুলি সংখ্যা আছে? 100 এবং 101 এর মধ্যে? 10 ^ 100 এবং 10 ^ 100 + 1 এর মধ্যে?

দ্রষ্টব্য: যদি এটি কোনও পার্থক্য করে তবে আমি জাভার doubleবিশেষত সংজ্ঞা দিতে আগ্রহী ।

উত্তর:


68

জাভা doubleগুলি আইইইই -754 ফর্ম্যাটে রয়েছে, অতএব তাদের 52-বিট ভগ্নাংশ রয়েছে; যে কোনও দুটি সংলগ্ন শক্তির মধ্যে double(এককে অন্তর্ভুক্ত করে এবং পরেরটির একচেটিয়া), এর ফলে 2 টি থেকে 52 তম শক্তি বিভিন্ন হবে (যার মধ্যে 4503599627370496)। উদাহরণস্বরূপ, এটি doubleঅন্তর্ভুক্ত ০.০ অন্তর্ভুক্ত এবং ০.০ এর মধ্যে স্বতন্ত্র s এর সংখ্যা এবং ঠিক অনেকগুলি ১.০ অন্তর্ভুক্ত এবং ২.০ বর্জন এবং এর মধ্যেও রয়েছে lie

doubles০.০ এবং ১.০ এর মধ্যে গণনা করা দু'জনের শক্তির মধ্যে করার চেয়ে শক্ত, কারণ এই ব্যাপ্তির মধ্যে দু'জনের অনেকগুলি শক্তি রয়েছে এবং এছাড়াও, কেউ অস্বীকৃত সংখ্যার কাঁটাযুক্ত সমস্যার মধ্যে চলে যায়। এক্সটোনারদের 11 টি বিটের মধ্যে 10 টি প্রশ্নযুক্ত পরিসীমাটিকে কভার করে, সুতরাং, অস্বীকৃতিযুক্ত সংখ্যা সহ (এবং আমি মনে করি কয়েকটি ধরণের NaN) আপনার doubleদুটি শক্তির মধ্যে 1024 গুণ গুলি থাকবে - 2**62যাইহোক মোটের চেয়ে বেশি কিছু নয় । অস্বীকৃত ও সি বাদ দিয়ে, আমি বিশ্বাস করি গণনাটি 1023 গুণ হবে 2**52

"100 থেকে 100.1" এর মতো স্বেচ্ছাসেবী ব্যাপ্তির জন্য এটি আরও শক্ত কারণ ওপরের সীমানাটি doubleহ'ল হিসাবে প্রমাণিত হতে পারে না (দুজনের কোনও শক্তির নিখুঁত একক নয়)। একটি সহজ অনুমান হিসাবে, যেহেতু দুটি শক্তির মধ্যে অগ্রগতি রৈখিক হয়, আপনি বলতে পারেন যে পরিসীমাটি 0.1 / 64দুটি পার্শ্ববর্তী শক্তির (64 এবং 128) মধ্যে বিস্তৃত হয়, সুতরাং আপনি আশা করতে চান

(0.1 / 64) * 2**52

স্বতন্ত্র doubleএস - যা আসে 7036874417766.4004... এক বা দুটি ;-) দিতে বা নিতে।


@ অ্যালেক্স: কেবলমাত্র লক্ষণীয়, আমি যখন 100 থেকে 100.1 লিখেছিলাম তখন আমি ভুল লিখেছিলাম। আমার অর্থ 100 থেকে 101. মূলত, স্বেচ্ছাসেবী এন এর জন্য N এবং N + 1 এর মধ্যে
পলিজেনুব্রিকেন্টস

4
@ অ্যালেক্স: সুতরাং আমাকে এটি সোজা করে দেওয়া যাক: 2**64সম্ভাব্য দ্বিগুণ মানের চেয়ে বেশি আর কিছু হতে পারে না (যেহেতু এটি একটি bit৪ বিটের ধরণের), এবং দৃশ্যত এই মানগুলির একটি বিশাল অনুপাত রয়েছে 0..1?
বহুজনিত ওষুধ

9
@ পলিজিন, হ্যাঁ এবং হ্যাঁ - বিশেষত, সম্ভাব্য মানগুলির প্রায় এক চতুর্থাংশ (যে কোনও বেস এবং সূচক বনাম ভগ্নাংশের দৈর্ঘ্যের কোনও "সাধারণ" ভাসমান পয়েন্ট উপস্থাপনার জন্য) ০.০ থেকে ১.০ এর মধ্যে রয়েছে (১.০ এবং অনন্তের মধ্যে আরও একটি চতুর্থাংশ এবং রিয়েল অক্ষের নেতিবাচক অর্ধেকের অর্ধেক বাকি)। মূলত, সূচকটির অর্ধেক মান (একটি সাধারণ পক্ষপাত সহ, এর সীমার মধ্যে অর্ধেক) বেসের নেতিবাচক শক্তিকে উপস্থাপন করে, সুতরাং সংখ্যাগুলি <1.0।
অ্যালেক্স মার্টেলি

8
@ পলিজেলব্রিকেন্টস: অনেক অ্যাপ্লিকেশনের জন্য, 100 থেকে 101 এর মধ্যে সীমা তুলনায় 0 থেকে 1 এর মধ্যে পরিধি অনেক বেশি গুরুত্বপূর্ণ এবং আকর্ষণীয়, এ কারণেই এটি মানগুলির একটি বড় অংশ পায় gets উদাহরণস্বরূপ, পদার্থবিদ্যায় আপনাকে প্রায়শই নিউটনের গ্র্যাভিয়েশনাল ধ্রুবকের মতো হাস্যকরভাবে ছোট মানগুলি 6.67e-11 এ ডিল করতে হয়। 100 থেকে 101 এর চেয়ে ভাল নির্ভুলতা থাকা আরও কার্যকর more আরও তথ্যের জন্য ভাসমান- পয়েন্ট- gui.de পড়ুন ।
মাইকেল বর্গওয়ার্ট

4
আপনি স্কেলটি আলাদাভাবে রাখছেন, গণনায় কম ত্রুটি অর্জন করে আপনি 0.0 এবং 1.0 এর মধ্যে যে কোনও সংখ্যার স্কেলও করতে পারেন can পুরো সংখ্যার লাইনটি যখন দুটি সংখ্যার মধ্যে ম্যাপ করা যায় তখন খুব ভাল!
কোডকাইজন

44

প্রতিটি doubleপ্রতিনিধিত্ব যার প্রতিনিধিত্ব 0x0000000000000000এবং এর মধ্যবর্তী স্থানে থাকে 0x3ff0000000000000[0.0, 1.0]। এটি (2 ^ 62 - 2 ^ 52) স্বতন্ত্র মানগুলি (শেষের দিকগুলি গণনা করে কিনা তার উপর নির্ভর করে একটি জোড় বা বিয়োগফল)।

ব্যবধান [১.০, ২.০] এর মধ্যে 0x3ff0000000000000এবং উপস্থানের সাথে মিল 0x400000000000000; এটি 2 ^ 52 স্বতন্ত্র মান।

ব্যবধান [100.0, 101.0] 0x4059000000000000এবং এর মধ্যে উপস্থাপনের সাথে সঙ্গতিপূর্ণ 0x4059400000000000; এটি 2 ^ 46 স্বতন্ত্র মান।

10 ^ 100 এবং 10 ^ 100 + 1 এর মধ্যে কোনও ডাবল নেই । এই সংখ্যার কোনওটিই দ্বিগুণ নির্ভুলতার জন্য উপস্থাপনযোগ্য নয় এবং এর মধ্যে কোনও ডাবল নেই। নিকটতম দুটি ডাবল যথার্থ নম্বরগুলি:

99999999999999982163600188718701095...

এবং

10000000000000000159028911097599180...

+1, একটি ভাল-সমর্থিত সঠিক উত্তরের জন্য। (আপনি যদি শেষের পয়েন্টগুলি গণনা করতে চান তবে মনে রাখবেন যে +0.0 এবং -0.0 এর আলাদা উপস্থাপনা রয়েছে))
জিম লুইস

4
+1, এমন মোড় শেষ! মনে হচ্ছিল আমি এম নাইট শ্যামলান লিপি পড়ছিলাম!
বহুবৃক্ষীয় পদার্থ

7

অন্যরা ইতিমধ্যে ব্যাখ্যা করেছেন যে [২.০, ০.০] এর মধ্যে প্রায় 2 ^ 62 ডাবল রয়েছে।
(সত্যিই অবাক হওয়ার আছে: প্রায় 2 ^ 64 স্বতন্ত্র সসীম ডাবলস হয়; যারা, অর্ধেক ইতিবাচক হয়, এবং প্রায় অর্ধেক এর 1.0 হয় <।)

তবে আপনি র্যান্ডম সংখ্যা জেনারেটরের উল্লেখ করেছেন: নোট করুন যে 0.0 এবং 1.0 এর মধ্যে একটি এলোমেলো সংখ্যা জেনারেটর সাধারণভাবে এই সমস্ত সংখ্যা উত্পাদন করতে পারে না ; সাধারণত এটি কেবলমাত্র n / 2 ^ 53 ফর্মের সংখ্যার সাথে একটি পূর্ণসংখ্যার উত্পাদন করবে (উদাহরণস্বরূপ জাভা ডকুমেন্টেশন নেক্সটডুবলের জন্য )। সুতরাং random()আউটপুটটির জন্য কেবল প্রায় 2 ^ 53 (+/- 1, যার উপরের পয়েন্টগুলি অন্তর্ভুক্ত থাকে তার উপর নির্ভর করে) সম্ভাব্য মানগুলি থাকে । এর অর্থ হল [0.0, 1.0] এ সর্বাধিক দ্বিগুণ কখনই উত্পন্ন হবে না।


3

নিবন্ধ জাভার নতুন গণিত, পার্ট 2: ফ্লোটিং পয়েন্ট সংখ্যার IBM থেকে এই সমস্যা সমাধানের নিম্নলিখিত কোড স্নিপেট অফার (ভাসে মধ্যে, কিন্তু আমি ভাল হিসাবে এটি ডাবলস জন্য কাজ করে সন্দেহ):

public class FloatCounter {

    public static void main(String[] args) {
        float x = 1.0F;
        int numFloats = 0;
        while (x <= 2.0) {
            numFloats++;
            System.out.println(x);
            x = Math.nextUp(x);
        }
        System.out.println(numFloats);
    }
}

তারা এই সম্পর্কে এই মন্তব্য আছে:

দেখা যাচ্ছে যে 1.0 এবং 2.0 সহ অন্তর্ভুক্ত 8,388,609 ভাসমান রয়েছে; এই পরিসরে বিদ্যমান প্রকৃত সংখ্যাগুলির বড় তবে খুব কমই অগণিত inity পরের সংখ্যাগুলি প্রায় 0.0000001 বাদে। এই দূরত্বটিকে সর্বনিম্ন নির্ভুলতা বা সর্বনিম্ন ইউনিটের এককের জন্য একটি ইউএলপি বলা হয়।


হ্যাঁ, তবে এটি নয়float , নয় double - floatগুলি ভগ্নাংশ 23 বিট 'মূল্য যাতে আছে, 2**23 -> 8388608দুই সংলগ্ন শক্তিগুলির মধ্যে বিভিন্ন মান (অবশ্যই "সমেত" অংশ আপনি যদি আরো একটি, দুটি পরবর্তী ক্ষমতা নির্ভর করতে অর্থ)। doubleএর 52 বিট ভগ্নাংশ আছে!
অ্যালেক্স মার্টেলি

4
@ অ্যালেক্স: আমার ধারণা আমি ফলাফলটি পাওয়ার আগে মহাবিশ্বের সমাপ্তি অবধি প্রোগ্রামটি (ডাবলসের জন্য সংশোধিত) চালিয়ে যেতে হবে ... :(
মার্ক রুশাকফ

4
আমি বোবা বোধ করি; আমি কেবল doubleসমতুল্য লিখেছি এবং ভেবেছিলাম "আরে, আমি আমার নিজের প্রশ্নের প্রায় 5 মিনিটের মধ্যে উত্তর দেব ..."
পলিজেনিউব্রিকেন্টস

4
@ পলিজেইন: এটি এমন একটি প্রকল্প এলারের সমস্যার মতো মনে হচ্ছে যেখানে গণনা করা সুস্পষ্ট পদ্ধতির পক্ষে অসম্ভব, তবে স্বেচ্ছাসেবী মামলার সমাধানের জন্য কিছু উজ্জ্বল সহজ সূত্র থাকতে হবে ...
মার্ক রুশাকফ

4
সম্ভবত সত্যিকারের সুপারচার্জড সুপার কম্পিউটারের সাথে নয়: একটি মেশিনে কেবল একটি ন্যানোসেকেন্ডকে অভ্যন্তরীণ লুপটি চালানোর জন্য double, দুটি সংলগ্ন শক্তির সাথে গণনা করতে প্রায় 52 দিন সময় লাগবে ( printlnঅবশ্যই অবশ্যই তা দ্রুত চালানো খুব কমই হবে, তাই যা তাই না আসুন ধরে নেওয়া যাক একটি বিবৃতি চলে যায় ;-)। আমি মনে করি একটি শক্তিশালী তবে বাস্তববাদী মেশিনে এক বছর বা তারও কম সময় নেওয়া সম্ভব; ;)।
অ্যালেক্স মার্টেলি

2
  1. 2 ^ 53 - লুকানো বিট সহ একটি 64 বিট ভাসমান পয়েন্ট সংখ্যার তাত্পর্যপূর্ণ / মান্টিসার আকার।
  2. মোটামুটি হ্যাঁ, যেহেতু সিফনিফ্যান্ড স্থির হয়ে গেছে তবে ঘটনাকারীর পরিবর্তন হয়।

দেখুন Wikipedia নিবন্ধটি দেখুন।


2 টির জন্য আপনার উত্তর কীভাবে আমি এফপির কাজ বুঝতে পারি তার বিরোধিতা করে।
বহুজনিত ওষুধ

আমি মনে করি 1ভুল সবসময় কারণ লুকানো বিট এক - তাই 2^52, না 2^53 স্বতন্ত্র মান (দুই সংলগ্ন ক্ষমতা, এক অন্তর্ভুক্ত এবং পরবর্তী এক বহির্ভূত মধ্যে - না ! 0.0 এবং 1.0 মধ্যে)।
অ্যালেক্স মার্টেলি

1

জাভা ডাবলটি একটি আইইইই 754 বাইনারি 64 নম্বর।

এর অর্থ হল আমাদের বিবেচনা করা দরকার:

  1. মান্টিসা 52 বিট
  2. 1023 পক্ষপাত সহ 11 বিট নম্বরযুক্ত (উদাহরণস্বরূপ এটিতে 1023 যুক্ত)
  3. যদি প্রকাশকটি সমস্ত 0 হয় এবং ম্যান্টিসাটি শূন্য হয় তবে সংখ্যাটি অ-সাধারণীকরণ করা হয়

এটির মূল অর্থ হ'ল সম্ভাব্য দ্বিগুণ উপস্থাপনার মোট 2 ^ 62-2 ^ 52 + 1 রয়েছে যা মান অনুযায়ী 0 এবং 1 এর মধ্যে রয়েছে নোট করুন যে 2 ^ 52 + 1 হ'ল নন-নরমালাইজড কেসগুলি অপসারণ করা সংখ্যা

মনে রাখবেন যে ম্যান্টিসা যদি ইতিবাচক হয় তবে উদ্দীপকটি নেতিবাচক হয় তবে 1 :-) এর চেয়ে কম হয়

অন্যান্য সংখ্যার জন্য এটি কিছুটা শক্ত কারণ আইইইই 754 উপস্থাপনায় প্রান্ত পূর্ণসংখ্যার সংখ্যাগুলি সঠিকভাবে উপস্থাপন করতে পারে না, এবং কারণগুলি সংখ্যার প্রতিনিধিত্ব করতে সক্ষম হওয়ার জন্য অন্যান্য বিট ব্যবহৃত হয়, সুতরাং সংখ্যাটি যত কম তত কম বিভিন্ন মান।

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