অবাস্তব, সি ++ এর ফ্লোট এবং FFloat32 এর মধ্যে পার্থক্যগুলি কী?


17

আমি ইউই 4 এর আরও গভীর দিকগুলি জানার চেষ্টা করেছি এবং অনেক উদাহরণ কোডগুলি এবং ইঞ্জিনের উত্স বেসটি পড়ার সময় আমি লক্ষ্য করেছি যে কখনও কখনও লোকেরা (এবং খুব উত্স কোড) স্ট্যান্ডার্ড সি ++ floatআদিম ব্যবহার করে তবে কখনও কখনও ইউই 4 এর কাস্টম বাস্তবায়ন ব্যবহার করে FFloat32

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


1
আমি যে উদাহরণগুলি পেয়েছি সেগুলি পড়তে আগ্রহী করব FFloat32

@ জোশপেট্রি তাদের মধ্যে কিছু অফ-লাইন ছিলেন, একটি দম্পতি অনলাইন ছিলেন। বাড়িতে সময় পাওয়ার সাথে সাথে আমি তাদের ভাগ করে নেওয়ার জন্য অনুসন্ধান করব
কিম শাটার

উত্তর:


17

float, ভাল, একটি সি ++ ভাসমান পয়েন্ট। FFloat32এটি এমন একটি কাঠামো যা একটি ফ্লোটকে প্রতিনিধিত্ব করে পাশাপাশি (ইউনিয়নের মাধ্যমে) সেই ভাসমানের চিহ্ন, ম্যান্টিসা এবং এক্সপোনেন্ট অংশগুলির জন্য পচে যাওয়া বিটফিল্ডগুলি।

আপনার সাধারণত কখনই ব্যবহার করা উচিত নয়FFloat32 :

  • আপনি এমন কিছু এপিআই ব্যবহার করছেন যা একটি FFloat32(এগুলি খুব বিরল) বা প্রত্যাশা করে
  • ভাসমান পয়েন্টের মান সহ আপনাকে কিছু ধরণের নিম্ন-স্তরের বিট হ্যাকারি করা দরকার (আজকাল মোটামুটি বিরল)

এটি প্রতি সপ্তাহে FFloat32খুব খারাপ নয় , এটি কেবলমাত্র সাধারণ-উদ্দেশ্য ভাসমান পয়েন্ট ব্যবহারের জন্য আপনাকে প্রয়োজনীয় কিছু দেয় না তা সত্যিই।

এটি কোনও পুরানো floatপ্লেইনের চেয়ে কম সাধারণ , যার কিছুটা স্বল্প পাঠযোগ্যতার প্রভাব রয়েছে (অন্যেরা এটি এক নজরে কী তা অবিলম্বে জানতে পারবেন না)। এটি সুস্পষ্টভাবে রূপান্তর করে নাfloat তাই আপনি something.FloatValueঅনেকগুলি টাইপ করবেন যা খুব বড় বিষয় নয়, তবে ক্লান্তিকর হতে পারে।

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

সুতরাং আপনার যদি ভাসমান পয়েন্ট উপস্থাপনে পৃথক বিটগুলির সাথে খেলার প্রয়োজন না হয় তবে আপনার সম্ভবত এড়ানো উচিত FFloat32(এর কাজিন,FFloat16 কিছুটা বেশি উপযোগ থাকতে পারে কারণ সেখানে স্ট্যান্ডার্ড 16-বিট সি ++ ভাসমান পয়েন্ট টাইপ নেই)।

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

এটি বলা উচিত যে অবাস্তবদের গিটহাব সংগ্রহস্থলের অনুসন্ধানে ধরণের খুব কম ব্যবহার প্রকাশিত হয় FFloat32। এঁরা সকলেই FFloat32নিজের সংজ্ঞা বা সংজ্ঞায় আছেন FFloat16


বিশেষত, FFloat32দুটি জিনিস যা সি ++ স্ট্যান্ডার্ড কল করে। এটা তোলে:

  • আপনাকে ইউনিয়নটির একাধিক সদস্য একসাথে সক্রিয় থাকলে এমন আচরণ করতে দেয়; আপনি ভাসমান পয়েন্ট সদস্যদের কাছে লিখতে এবং পূর্ণসংখ্যার সদস্যদের মধ্যে একটির কাছ থেকে পড়ার প্রত্যাশা করা হয় (9.5.1, [ক্লাস.উনিয়ন])
  • ইউনিয়নের মধ্যে বিটফিল্ড বরাদ্দ একটি আইইইই ভাসমান পয়েন্ট মানের বিট বরাদ্দের সাথে মেলে বলে প্রত্যাশা করে; তবে, শ্রেণিবদ্ধের মধ্যে বিটফিল্ড সদস্যদের বরাদ্দ এবং প্রান্তিককরণ বাস্তবায়ন সংজ্ঞায়িত করা হয় (9.6.1, [শ্রেণী.বিট])

অবাস্তব স্ট্যান্ডার্ড সি ++ তে লিখিত হয় না, এটি যে নির্দিষ্ট সংকলকগুলির জন্য লেখা হয় তাদের জন্য এটি লেখা হয়, যতক্ষণ না তারা প্রত্যাশিত কাজটি করেন ততক্ষণ মানটি অপ্রাসঙ্গিক।
ব্যবহারকারী 253751

আমি প্রত্যাশা করব যে বিটফিল্ডগুলি স্ট্যান্ডার্ড সি / সি ++ তেও যথেষ্ট পোর্টেবল হবে, যেহেতু সেগুলি আইইইই স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত করা হয়েছে এবং এর জন্য কোনও ভিন্ন লেআউট ব্যবহার করে যে কোনও সংকলক আইইইই 754 এর সাথে সামঞ্জস্যপূর্ণ লাল চিহ্ন floatপাবেন না (এবং প্রচুর বিদ্যমান সফ্টওয়্যারের সাথে সামঞ্জস্যের ঝামেলা রয়েছে) )।
দিমিত্রি গ্রিগরিয়েভ

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

@ জোশপেট্রি পয়েন্টটি নেওয়া হয়েছে, স্পষ্টতার জন্য ধন্যবাদ।
দিমিত্রি গ্রিগরিয়েভ

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