ভাসমান পয়েন্ট যথার্থতা সম্পর্কে এবং কেন আমরা এখনও এটি ব্যবহার করি


38

বৃহত বিশ্বগুলিতে নির্ভুলতার জন্য ভাসমান পয়েন্টটি বরাবরই সমস্যাযুক্ত।

এই নিবন্ধটি পর্দার আড়ালে ব্যাখ্যা করে এবং সুস্পষ্ট বিকল্প - স্থির পয়েন্ট সংখ্যা সরবরাহ করে। কিছু তথ্য সত্যই চিত্তাকর্ষক, যেমন:

"ঠিক আছে 64 বিট সূক্ষ্মতা আপনাকে সাব মাইক্রোমিটার নির্ভুলতার সাথে সূর্য (7.4 বিলিয়ন কিলোমিটার) থেকে দূরে প্লুটো পর্যন্ত পৌঁছে দেয়।"

ভাল সাব-মাইক্রোমিটার নির্ভুলতা কোনও fps প্রয়োজনের চেয়ে বেশি (অবস্থান এবং এমনকি বেগের জন্য), এবং এটি আপনাকে সত্যই বড় ওয়ার্ল্ডস তৈরি করতে সক্ষম করবে।

আমার প্রশ্ন হ'ল যদি স্থির পয়েন্টের এমন সুবিধা থাকে তবে আমরা এখনও ভাসমান পয়েন্টটি ব্যবহার করব কেন? বেশিরভাগ রেন্ডারিং এপিআই এবং পদার্থবিজ্ঞানের লাইব্রেরিগুলি ভাসমান পয়েন্ট ব্যবহার করে (এবং এর অসুবিধাগুলি ভোগ করে, তাই বিকাশকারীদের তাদের আশেপাশের হওয়া প্রয়োজন)।

এগুলি কি এত ধীর?

অতিরিক্তভাবে, আপনি কীভাবে ভাবছেন যে বহিরাগত বা অনন্তের মতো স্কেলযোগ্য গ্রহের ইঞ্জিনগুলি বড় আকারে পরিচালনা করে? তারা কি অবস্থানের জন্য স্থির বিন্দু ব্যবহার করে বা তাদের কিছু অ্যালগরিদম বিভাজনকারী স্থান রয়েছে?


3
সর্বশেষ "অতিরিক্তভাবে" বিটটি সম্ভবত একটি পৃথক প্রশ্ন হওয়া উচিত যাতে প্রধানটি বিভ্রান্ত না হয়।
টেট্রাড

আমি কীভাবে স্থির পয়েন্টটি জোর করতে পারি তা চিত্রিত করতে চাই ... আমার গেমটিতে সব ধরণের অদ্ভুত ত্রুটি রয়েছে কারণ লুয়া এফপিইউ এবং ডাইরেক্টএক্স ফিডলগুলি এফপিইউ দিয়েও ব্যবহার করে ... আমি 2 * 9000 = 17995 বা 500 * 10 এর মতো জিনিস দেখেছি = 4897 এটি সত্যিই নির্বোধ। তবে সবচেয়ে খারাপ ত্রুটি সম্ভবত ওগ্র্রে 3 ডি ফোরামে আলোচিত, যেখানে 1 + 5 = 4
স্পিডার

3
কোনও মন্তব্যকে ন্যায়সঙ্গত করেনি; তবে আপনি যদি নির্ধারিত পয়েন্ট কিউ-ফ্লোটগুলি ব্যবহার করার সিদ্ধান্ত নেন ( en.wikedia.org/wiki/Q_(number_format) ) আপনার বন্ধু; তারা হাস্যকরভাবে দ্রুত এবং কার্যকর করা সহজ।
জোনাথন ডিকিনসন

সুতরাং, সংক্ষেপে বলতে গেলে I আমি কি ভাসমান পয়েন্টগুলি (যদি আমি জাভা বা পাইথনটিতে কাজ করছি) দিয়ে থাকি? - Gastón 26 মিনিট আগে
Gastón

উত্তর:


20

আপনি যদি আমাকে নির্লজ্জ প্লাগের অনুমতি দেন তবে আমি আপনাকে আসল একটি গেমের (ইউটিউব ভিডিও লিঙ্ক) থেকে একটি উদাহরণ দেব ।

গেমটির একটি পদার্থবিজ্ঞানের ইঞ্জিনে একটি অসীম, প্রক্রিয়াজাতভাবে তৈরি বিশ্ব রয়েছে। এটি একক নির্ভুলতা ভাসমান পয়েন্ট ব্যবহার করে। কয়েক শ মিটার গেম স্পেসের পরে, নির্ভুলতার সমস্যাগুলি উত্থিত হতে শুরু করে (এবং আপনি যে উত্সটি পাবেন তার থেকে ধীরে ধীরে আরও খারাপ হয়ে উঠুন)।

আমার সমাধান? প্রতি 200 মিটার বা তার পরে আমি গোটা বিশ্বকে 200 মিটার দিয়ে উত্সের দিকে ফিরিয়ে আনি (যদি আপনি আমার সাইটে কোনও প্রোটোটাইপ খুঁজে বের করতে এবং চেষ্টা করতে চান এবং [ডাব্লু] অর্ল্ড ডিবাগ ওভারলে আনেন তবে আপনি এটি দেখতে পাবেন)।

কেন নির্দিষ্ট পয়েন্ট ব্যবহার করবেন না? নাকি ডাবল স্পষ্টতা? পরিবর্তে একক নির্ভুলতা? কারণ বাকি সমস্ত কিছুই একক নির্ভুলতা ভাসমান পয়েন্ট ব্যবহার করছে!

আমি যে ফিজিক্স ইঞ্জিনটি ব্যবহার করছি এটি এটি ব্যবহার করে, এক্সএনএ এটি ব্যবহার করে, গ্রাফিক্স কার্ডে যে ডেটা লোড হয় সেগুলি একক নির্ভুলতা ভাসমান পয়েন্ট হিসাবে ফর্ম্যাট করা হয়। এমনকি ভাষা নিজেই ভাসমান পয়েন্ট সংখ্যাগুলির সাথে কাজ করার জন্য ডিজাইন করা হয়েছে - লেখার জন্য এবং (আরও গুরুত্বপূর্ণভাবে) পড়ার 0.5fচেয়ে অনেক সহজ 0x80000000L

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

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


আমি সবসময় ভাবতাম যে কিছু অ্যাপ্লিকেশনের পক্ষে অন্য সমস্ত কিছু সরিয়ে নেওয়া এবং "প্লেয়ার" কে মূল দিকে রাখা কি আরও সহজ । আকর্ষণীয় আমি একমাত্র না!
ড্যাশ-টম-ব্যাং

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

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

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

একমত। আজকের প্রসেসরগুলি খুব সহজেই ভাসমান বিন্দু নির্দেশাবলী কার্যকর করে, নির্দেশাবলীর মধ্যে দুর্দান্ত থ্রুপুট থাকে এবং বেশিরভাগটি পূর্ণসংখ্যার নির্দেশিকাগুলির তুলনায় কয়েকটি চক্রের দীর্ঘতর দীর্ঘতরতা।
দউগ 65536

11

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

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


5

আরেকটি গুরুত্বপূর্ণ বিষয়টি তৈরি করা হচ্ছে যে ভাসমানগুলি এতটা সঠিক নয় যেমন এখানকার লোকেরা মনে করে। একটি 32-বিট ফ্লোটে পূর্ণ সংখ্যক নির্ভুলতার 24-বিট রয়েছে has এর অর্থ এটি যে কোনও প্রদত্ত ব্যাপ্তির জন্য 24-বিট নির্দিষ্ট পয়েন্ট মানের হিসাবে কমপক্ষে নির্ভুল। ভাসমানগুলি যত কম পরিমাণে বৃহত্তর মান হয়ে ওঠে ঠিক ততক্ষণে একটি নির্দিষ্ট পয়েন্টের মানটি সহজেই উপচে পড়বে এবং কোনও কোনও সময়ে চারপাশে আবৃত হবে। নির্ভুলতা হ্রাস করা একটি ভাল ফ্যালব্যাক। ভাসমানগুলিও উপচে পড়তে পারে তবে অনেক পরে। আমি আপনার মুখগুলি দেখতে চাই যখন স্থির পয়েন্ট ওভারফ্লোর কারণে আপনার বিশ্বটি হঠাৎ করে -2 ^ 31 এর কাছাকাছি .েকে দেয়।

-৪-বিট ফ্লোটিং পয়েন্টের মানগুলির মধ্যে 53-বিটসের পূর্ণসংখ্যার নির্ভুলতা রয়েছে, তাই এগুলি সত্যই সঠিক।


ভাসমান পয়েন্টের মানগুলি আসলে উপচে পড়ে না; যদি কোনও গণনার ফলাফল উপস্থাপনের আকারে খুব বেশি হয় তবে ফলাফলটি ইতিবাচক বা নেতিবাচক অনন্ত।
আনারস

3

একটি এফপিএস প্রসঙ্গে, স্থির-পয়েন্টের মানগুলি সম্ভবত একটি দায়বদ্ধতা হতে পারে। শূন্য ভাসমান-পয়েন্টের কাছাকাছি আরও সঠিক। এটি কেবলমাত্র বৃহত্তর দূরত্বে স্থির-পয়েন্ট আরও বেশি পছন্দসই হয়ে ওঠে। উত্তরটি কেবল তার প্রসঙ্গে নির্ভর।

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

আইআইআরসি, ইনফিনিটির ডেভ বলেছেন যে তিনি তার একটি সাক্ষাত্কারে নিয়মিত স্কেল ইস্যুতে ঘুরছিলেন।


এটি অসম্ভব যে কোনও খেলায় আপনার ভাসমান পয়েন্টের "কাছাকাছি শূন্যের" নির্ভুলতা প্রয়োজন। আপনার যদি এক মিটার ইউনিট থাকে তবে 10 বিট যথার্থতা আপনাকে সাব-মিলিমিটার যথার্থতা দেয় এবং এখনও আপনি 32 বিট মান সহ আটকে থাকলে প্রতিটি দিকে 4000 কিলোমিটারের বেশি মডেল করতে দেয়। আপনার যদি মিলিমিটারের চেয়ে বেশি নির্ভুলতার প্রয়োজন হয় তবে আপনি অবশ্যই আরও কয়েকটি বিট স্থানান্তর করতে পারেন। কোনও স্পেস গেমটিতে bit৪ বিটের মানগুলিতে স্থানান্তর করা আপনাকে পুরো ভলিউম জুড়ে ধ্রুবক নির্ভুলতার সাথে সৌরজগত (বা আরও?) দেবে।
ড্যাশ-টম-ব্যাং

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

ঘটনাক্রমে, আমি এমন একটি গেমে কাজ করেছি যেখানে আমাদের প্রতিটি দিকে 4000 কিলোমিটারেরও বেশি মডেল করতে হয়েছিল। অন্যান্য প্রকল্পের কোডের সাথে সামঞ্জস্যের জন্য, এটি পজিশনের জন্য 32 বিট ব্যবহার করতে হয়েছিল। কোডের পুনঃব্যবহার এবং আজ গেম ওয়ার্ল্ডের আকারের বাণিজ্যিক দাবিগুলির ভিত্তিতে এটি কোনও তাত্ত্বিক সমস্যা নয়।

1

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

সঠিক সমাধান নির্ভর করে আপনি কীভাবে ইঞ্জিনের চরম দূরত্বগুলি পরিচালনা করতে চান - আপনি কী জাম্প গেট, বা সময় সংকোচনের পরিকল্পনা করেন?


1

এর অন্যতম কারণ হ'ল ভাসমান পয়েন্ট গণিতটি "যথেষ্ট ভাল" (বা কমপক্ষে এটি হয়েছে), এটি মোটামুটি নির্ভুল ফলাফল দ্রুত উত্পাদন করে।

যতক্ষণ আপনি ভাসমান পয়েন্ট গণিতের সীমাবদ্ধতা সম্পর্কে অবগত হন এবং এগুলি মোকাবেলায় আপনার অ্যালগরিদমগুলি পরিবর্তন করেন (অ্যান্ড্রু রাসেলের উত্তর দেখুন) তারপরে আপনি এমন কোড তৈরি করবেন যা "কাজ করে"।


-1

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

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