কেন একটি উত্স থেকে ভাসমান পয়েন্ট সংখ্যার রেজোলিউশন আরও হ্রাস পায়?


19

আমার ওপেনজিএল দৃশ্যে এমন অবজেক্ট রয়েছে যা হাস্যকরভাবে অবস্থান থেকে অনেক দূরে অবস্থিত। আমি যখন এই বিষয়গুলি দেখি এবং তাদের চারপাশে একটি ক্যামেরা প্যান / রোটেট / জুম করি তখন তারা 'জিটার' করে। অর্থাৎ, অবজেক্টের সমন্বয়ে উল্লম্বগুলি একটি কাল্পনিক 3 ডি পয়েন্টের গ্রিডের চারপাশে স্ন্যাপ বলে মনে হচ্ছে। আমি পড়েছি এটি একটি সাধারণ সমস্যা কারণ ভাসমান পয়েন্ট যথার্থতা (যা ওপেনজিএল, এবং অন্য সমস্ত কিছু ব্যবহার করে) ব্যবহার করে যে পরিমাণ পরিমাণ তথ্য সংরক্ষণ করা যায় of যদিও কেন এটি ঘটে তা আমি পাই না ।

সমাধান অনুসন্ধান করার সময়, আমি খুব সাধারণ 'ভাসমান উত্স' সংশোধন করে এসেছি এবং এটি কার্যকর বলে মনে হচ্ছে। আমি কেবল সমস্ত কিছুর রূপান্তর করি যাতে আমার অবজেক্টগুলি একই আপেক্ষিক অবস্থানে থাকে তবে আমার ক্যামেরায় যা দেখছে তা উত্সের কাছাকাছি। আমি এখানে একটি ব্যাখ্যা পেয়েছি: http://floatingorigin.com/ , কিন্তু আমি এটি অনুসরণ করতে পারি না।

সুতরাং ... কেউ যদি ব্যাখ্যা করতে পারে যে কেন আমার দৃশ্যের অবস্থান থেকে খুব দূরে অবস্থান করা (10 মিলিয়ন ইউনিট বলুন) ফলাফলটি আমি পর্যালোচনা করে যাচ্ছি তার ফলাফলের ফলাফল? এবং কেন এটি এটিকে উত্সের কাছাকাছি নিয়ে যাওয়া সমস্যার সমাধান করে?


4
কারণ তারা যদি তা না করে তবে তারা স্থির- পয়েন্ট নম্বর হবে। টোটোলজিকাল প্রশ্ন, এটি।
এমএসএলটার

1
সত্য, তবে কেবল তখন যখন আপনি বুঝতে পারবেন যে 'ফ্লোটিং পয়েন্ট' আসলে কী বোঝায়।
কাইলোটন

উত্তর:


26

কম্পিউটারে ভাসমান পয়েন্টগুলি প্রতিনিধিত্ব করার কারণে এটি সবই।

পূর্ণসংখ্যা বেশ সোজাভাবে সংরক্ষণ করা হয়; প্রতিটি ইউনিট "পূর্ববর্তী" থেকে ঠিক "এক" পৃথক যেমন আপনি গণনাযোগ্য সংখ্যার সাথে প্রত্যাশা করতেন।

ভাসমান পয়েন্ট সংখ্যা সহ এটি ঠিক তেমন হয় না। পরিবর্তে, বেশ কয়েকটি বিট EXPONENT নির্দেশ করে এবং বাকীটি চূড়ান্ত ফলাফল দেওয়ার জন্য ম্যান্টিসা বা ভগ্নাংশের অংশ হিসাবে চিহ্নিত হয় যা ঘনিষ্ঠ অংশ দ্বারা প্রকাশিত হয় (স্পষ্টভাবে 2 ^ এক্সপ্রেস)।

বিটগুলির চাক্ষুষ ব্যাখ্যার জন্য এখানে দেখুন ।

সংক্ষিপ্ত আকারে এই ঘটকটি বিটগুলির প্রকৃত অংশ হওয়ার কারণে সংখ্যাগুলি বড় হওয়ার সাথে সাথে নির্ভুলতা শুরু হতে শুরু করে।

এটি কার্যকরভাবে দেখতে, আসুন কৌতুকপূর্ণ-প্রবৃত্তিতে না গিয়ে একটি ভাসমান-ভাসমান বিন্দু উপস্থাপনা করি: 2 এর মতো ছোট খাটো করে নেওয়া এবং পরীক্ষার জন্য কিছু ভগ্নাংশ করা:

2 * 2 ^ 2 = 8

3 * 2 ^ 2 = 12

4 * 2 ^ 2 = 16

... ইত্যাদি।

এই সংখ্যাগুলি কেবলমাত্র ২ টি বেজায় বেড়ে যায় না তবে এখন 38৮ টি চেষ্টা করে দেখি:

2 * 2 ^ 38 = 549755813888

3 * 2 ^ 38 = 824633720832

4 * 2 ^ 38 = 1099511627776

ওহ, এখন বিশাল পার্থক্য!

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

ফ্লোট অরিজিন পদ্ধতিটি কাজ করার কারণটি হ'ল কারণ এটি সমস্ত সম্ভাব্য বৃহত-এক্সপোঞ্জেন্ট ভাসমান পয়েন্ট সংখ্যাগুলি ছোট-ঘাতকের কাছে ডাউন করে যাতে "পরবর্তী গণ্যমান্য" (যথার্থতা) খুব ছোট এবং খুশি হতে পারে sc


আপনি যে উদাহরণগুলি দিয়েছেন তা সত্যই উদাহরণস্বরূপ, ধন্যবাদ :)
প্রিস

3
সঠিক পথে, তবে আমি আশা করি যে আপনি উদাহরণগুলি ব্যবহার করেছেন যা ভাসমান পয়েন্টটি সত্যিই কাজ করে to এটি ম্যান্টিসাকে কাঙ্ক্ষিত করে তোলে না; এটি ম্যান্টিসা * 2 ^
নাথান রেড

3
আপনি ঠিক বলেছেন, আমি জানতাম যে; আমি কী ভাবছিলাম জানি না। আমার উত্তর সম্পাদনা।

1
@ স্কটডব্লিউ সুন্দর সম্পাদনা করুন! +1
নাথান রিড

17

কারণ ভাসমান পয়েন্ট সংখ্যাগুলি ভগ্নাংশ + সূচক + চিহ্ন হিসাবে উপস্থাপন করা হয় এবং ভগ্নাংশের অংশের জন্য আপনার কাছে নির্দিষ্ট পরিমাণ বিট থাকে।

http://en.wikipedia.org/wiki/Single_precision

আপনি বৃহত্তর এবং বৃহত্তর সংখ্যা পাবেন, আপনি ছোট অংশ উপস্থাপন করার জন্য বিট নেই।


8

ক্ষেত্রের ক্লাসিকটি অবশ্যই সামনে আনতে হবে: প্রতিটি কম্পিউটার বিজ্ঞানী ভাসমান পয়েন্ট সংখ্যা সম্পর্কে কী জানতে পারেন

তবে এর সংক্ষিপ্তসারটি কীভাবে একক (ডাবল) যথার্থ ফ্লোটিং পয়েন্ট সংখ্যাগুলি মাত্র 32 বিট (-৪-বিট) বাইনারি সংখ্যা যা 1 বিট চিহ্নটির প্রতিনিধিত্ব করে, বেস 2 এর 8-বিট (11-বিট) এক্সপোনেন্ট , এবং একটি 23 বিট (52-বিট) তাত্পর্যপূর্ণ (প্রথম বন্ধনী দ্বিগুণের মান))

তার অর্থ আপনি একক নির্ভুলতায় যে প্রতিনিধিত্ব করতে পারেন তার মধ্যে সবচেয়ে ছোট ধনাত্মক সংখ্যাটি 0.0000000000000000000001 x 2 -127 = 2 -22 x 2 -127 = 2 -149 ~ 1.40 x 10 -45

পরবর্তী ধনাত্মক সংখ্যাটি দ্বিগুণ: 0.000000000000000000000010 x 2 -127 = 2 -148 ~ 2.80 x 10 -45 এবং তারপরের পরবর্তী সংখ্যাটি আগের দুটি 0.000000000000000000000011 x 2 -127 = 3 x 2 -149 ~ 4.2 এর যোগফল - 45

এটি একই ধ্রুবক পার্থক্যের অবধি বৃদ্ধি অব্যাহত রয়েছে: 0.111111111111111111111111 x 2 -127 = 2 -126 - 2 149 ~ 1.17549435 x 10 -38 - 0.00000014 x 10 -38 = 1.17549421 x 10 -38

এখন আপনি সাধারণ সংখ্যায় পৌঁছে গেছেন (যেখানে অর্থের প্রথম সংখ্যাটি 1) বিশেষভাবে: 1.000000000000000000000000 x 2 -126 = 2 -126 = 1.17549435 x 10 -38 এবং পরের সংখ্যাটি তখন 1.0000000000000000000001 x 2 -126 = 2 -126 (1 + 2 -22 ) = 1.17549435 x 1.00000023।


2

উত্স থেকে ভাসমান-পয়েন্ট সংখ্যাগুলি আরও কম সুনির্দিষ্ট হওয়ার কারণ হ'ল একটি ভাসমান-পয়েন্ট সংখ্যাটি বৃহত সংখ্যক প্রতিনিধিত্ব করতে সক্ষম হবে বলে মনে করা হচ্ছে। যেভাবে এটি করা হয় এটি এটিকে "ভাসমান বিন্দু" শব্দটি ধার দেয়। এটি গ্রহণ করতে পারে এমন সম্ভাব্য মানগুলি বিভক্ত করে তোলে (যা এটি তার বিট-দৈর্ঘ্য দ্বারা নির্ধারিত হয়) যাতে প্রতিটি ব্যয়কারীর জন্য প্রায় একই সংখ্যা থাকে: 32-বিট ফ্লোটের জন্য, বিটের 23 টি ম্যান্টিসাকে বা তাত্পর্যকে সংজ্ঞায়িত করে। সুতরাং এটি প্রতিটি খাঁটি ব্যাপ্তির মধ্যে 2 ^ 23 টি আলাদা মানের মান নিতে সক্ষম হবে। এই ক্ষতিকারক পরিসীমাগুলির মধ্যে একটি হল 1-2 [2 ^ 0 থেকে 2 ^ 1], সুতরাং 1 থেকে 2 পরিধিকে 2 ^ 23 বিভক্ত করা বিভিন্ন মানকে অনেক নির্ভুলতার জন্য অনুমতি দেয়।

তবে [2 ^ 10 থেকে 2 ^ 11] সীমাটি 2 ^ 23 বিভিন্ন মানের মধ্যে বিভক্ত করার অর্থ প্রতিটি মানের মধ্যে স্থানটি অনেক বড়। যদি এটি না হয়, তবে 23 বিট পর্যাপ্ত হবে না। পুরো জিনিসটি একটি আপস: কোনও আসল সংখ্যার প্রতিনিধিত্ব করতে আপনার অসীম সংখ্যক বিট দরকার। যদি আপনার অ্যাপ্লিকেশন এমনভাবে কাজ করে যা আপনাকে বৃহত্তর মানগুলির জন্য নিম্ন নির্ভুলতার সাথে দূরে সরে যেতে দেয় এবং আপনি বড় আকারের প্রকৃত পক্ষে উপস্থাপন করতে সক্ষম হয়ে উপকৃত হন তবে আপনি একটি ভাসমান পয়েন্ট উপস্থাপনা ব্যবহার করেন।


মাত্র 7 বছর পরে আরও পর্যালোচনা করার পরে এখানে একটি নোট তৈরি করা ... আমার উদাহরণগুলিতে আমার সংখ্যাগুলি বিশেষভাবে সুনির্বাচিত নয়। তবে সামগ্রিক পয়েন্টগুলি বৈধ।
স্টিভেন লু

1

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

ম্যান্টিসা × 10 এক্সপোজেন্ট

যখন ঘনিষ্ঠ 0 হয়, 0-999 পরিসরের প্রতিটি পূর্ণসংখ্যাকে যথাযথভাবে উপস্থাপন করা যায়। যখন এটি 1 হয়, আপনি মূলত এই ব্যাপ্তির প্রতিটি উপাদানকে 10 দ্বারা গুণিত করেন, তাই আপনি 0-9990 পরিসীমা পান; তবে এখন, কেবল 10 এর গুণকগুলি সঠিকভাবে উপস্থাপন করা যেতে পারে, কারণ আপনার কাছে এখনও কেবলমাত্র তিন অঙ্কের নির্ভুলতা রয়েছে। যখন ব্যয়কারীর সর্বাধিক 9 হয়, প্রতিটি জোড় উপস্থাপনযোগ্য পূর্ণসংখ্যার মধ্যে পার্থক্য এক বিলিয়ন । আপনি আক্ষরিক পরিসীমা জন্য নির্ভুলতা ট্রেড করছেন।

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


0

সাধারণভাবে, রেজোলিউশনটি আরও খারাপ হয় কারণ রেজোলিউশনটি এক্সপোনেন্ট ভ্যালু (2 ** এক্সপোনেন্ট অংশ) দ্বারা গুণিত হয়।

জোশের মন্তব্যের স্বীকৃতি হিসাবে: উপরেরটি কেবল একটি সংক্ষিপ্ত বিবৃতিতে উত্তরটি দেওয়া হয়েছিল। অবশ্যই, যেমন আমি http://floatingorigin.com/ এ ইঙ্গিত করার চেষ্টা করেছি , এটি কেবল একটি সামগ্রিক সমাধানের দিকে শুরু হচ্ছে এবং আপনার প্রোগ্রামের অনেকগুলি জায়গা থেকে চিটকটি থাকতে পারে: নির্ভুল পাইপলাইন বা কোডের অন্যান্য অংশে ।


এটি এমন কোনও কিছু যুক্ত করে না যা ইতিমধ্যে অন্যান্য উত্তরে উপস্থিত নেই।

সত্য: আমি বুঝতে পেরেছি যে আমি উত্তরটিকে একটি লাইনে বর্ণনা করতে পারি এবং ভেবেছিলাম যে কেউ সম্ভবত একটি সংক্ষিপ্ত উত্তরটি দরকারী খুঁজে পেতে পারেন।
ক্রিস থর্ন

-1

ওপেনজিএল গভীরতা বাফার লিনিয়ার নয় । আপনি যতই ঘৃণ্য হন, এটির নিকৃষ্টতর রেজোলিউশন। আমি পড়তে সুপারিশ এই । সেখান থেকে কিছু নেওয়া হয়েছে (12.070):

সংক্ষেপে, দৃষ্টিকোণ বিভাজন, তার প্রকৃতির দ্বারা, পিছনের চেয়ে ভিউ ভলিউমের সামনের কাছে আরও Z স্পষ্টতা তৈরি করে।

এবং অন্য একটি (12.040):

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

সুতরাং আপনার কাছাকাছি ক্লিপিং প্লেনটি আপনার যতদূর যেতে পারে এবং আপনার দূরবর্তী বিমানটি আপনার কাছের নিকটে যেতে হবে move


-1: প্রশ্নটি ভাসমান-পয়েন্ট যথার্থতার বিষয়ে, নন-লিনিয়ার গভীরতা বাফার উপস্থাপনের সাথে নির্ভুলতার সমস্যাগুলির নয়।
নাথান রেড

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

2 নাথন রিড: লেখক লিখেছেন, তাঁর ওপেনজিএল দৃশ্য আছে, তাই আমি ভেবেছিলাম, এটিও এই সমস্যা হতে পারে।
জাকারমার্জ

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