না, এটি অন্য কোনও "কেন (1 / 3.0) * 3! = 1" প্রশ্ন নয়।
আমি ইদানীং অনেকটা ভাসমান-পয়েন্ট সম্পর্কে পড়ছি; বিশেষত, কীভাবে একই গণনা বিভিন্ন আর্কিটেকচার বা অপ্টিমাইজেশন সেটিংসে বিভিন্ন ফলাফল দিতে পারে ।
ভিডিও গেমগুলির ক্ষেত্রে এটি একটি সমস্যা যা পির -টু-পিয়ার নেটওয়র্ক (সার্ভার-ক্লায়েন্টের বিপরীতে) হয়, যা সমস্ত ক্লায়েন্টরা প্রোগ্রাম চালানোর সময় ঠিক একই ফলাফল উত্পন্ন করে - একটিতে সামান্য তাত্পর্য ভাসমান-পয়েন্ট গণনা বিভিন্ন মেশিনে (বা এমনকি একই মেশিনে! ) মারাত্মকভাবে আলাদা গেম-স্টেটের দিকে নিয়ে যেতে পারে
এটি প্রসেসরের মধ্যেও ঘটে যা আইইইই -754 "অনুসরণ" করে , মূলত কারণ কিছু প্রসেসর (x86) ডাবল বর্ধিত নির্ভুলতা ব্যবহার করে । এটি হ'ল, সমস্ত গণনা করতে তারা 80-বিট রেজিস্টার ব্যবহার করে, তারপরে 64- বা 32-বিটগুলিতে ছাঁটাই করে, গণনার জন্য 64- বা 32- বিট ব্যবহারকারী মেশিনগুলির চেয়ে বিভিন্ন বৃত্তাকার ফলাফলের দিকে নিয়ে যায়।
আমি অনলাইনে এই সমস্যার বেশ কয়েকটি সমাধান দেখেছি, তবে সমস্ত সি ++ এর জন্য, সি # নয়:
- (উইন্ডোজ), (লিনাক্স?), বা (বিএসডি)
double
ব্যবহার করে দ্বিগুণ প্রসারিত-নির্ভুলতা মোড (যাতে সমস্ত গণনাগুলি আইইইই-754 64-বিট ব্যবহার করে) অক্ষম করে ।_controlfp_s
_FPU_SETCW
fpsetprec
- সর্বদা একই অপটিমাইজেশন সেটিংস সহ একই সংকলকটি চালান এবং সমস্ত ব্যবহারকারীদের একই সিপিইউ আর্কিটেকচার (কোনও ক্রস-প্ল্যাটফর্ম প্লে না) থাকা প্রয়োজন। কারণ আমার "সংকলক" আসলে জেআইটি, যা প্রতিটি সময় প্রোগ্রামটি চালিত হওয়ার পরে আলাদাভাবে অনুকূলিত হতে পারে , আমি মনে করি এটি সম্ভব কিনা।
- নির্দিষ্ট পয়েন্ট গণিত ব্যবহার করুন, এবং এড়ানো
float
এবংdouble
পুরোপুরি।decimal
এই উদ্দেশ্যে কাজ করবে, তবে অনেক ধীর হবে এবংSystem.Math
লাইব্রেরির কোনও কার্যই এটি সমর্থন করে না।
সুতরাং, এটি কি সি # তেও সমস্যা? আমি যদি কেবল উইন্ডোজকে সমর্থন করি না (মনো নয়)?
যদি তা হয় তবে আমার প্রোগ্রামটিকে সাধারণ ডাবল-স্পষ্টতাতে চালাতে বাধ্য করার কোনও উপায় আছে কি?
যদি তা না হয় তবে এমন কোনও গ্রন্থাগার রয়েছে যা ভাসমান-পয়েন্ট গণনাগুলিকে সামঞ্জস্য রাখতে সহায়তা করবে ?
strictfp
কীওয়ার্ড রয়েছে, যা বর্ধিত আকারের পরিবর্তে বর্ণিত আকারে ( float
বা double
) সমস্ত গণনা করতে বাধ্য করে । তবে জাভাতে এখনও আইইই -754 সমর্থন নিয়ে অনেক সমস্যা রয়েছে। খুব (খুব, খুব) কয়েকটি প্রোগ্রামিং ল্যাঙ্গুয়েজ আইইই-75৫৪ ভালভাবে সমর্থন করে।