আমার সিতে একটি বিশাল আকারের মডেল (~ 5000 লাইন) লেখা আছে এটি একটি সিরিয়াল প্রোগ্রাম, কোথাও এলোমেলো সংখ্যা জেনারেশন সহ। এটি এফএফটি ব্যবহার করে ফাংশনগুলির জন্য এফএফটিডাব্লু লাইব্রেরি ব্যবহার করে - আমি এফএফটিডাব্লু বাস্তবায়নের বিশদ জানি না, তবে আমি অনুমান করি যে এর মধ্যে উপস্থিত ফাংশনগুলিও নির্ধারক (আমি ভুল করে থাকলে আমাকে সংশোধন করি)।
আমি যে বিষয়টি বুঝতে পারি না তা হ'ল আমি একই মেশিনে (একই সংকলক, একই গ্রন্থাগার) অভিন্ন রানের ফলাফলগুলিতে ছোট পার্থক্য পাচ্ছি।
আমি ডাবল-স্পষ্টতা ভেরিয়েবলগুলি ব্যবহার করি এবং value
উদাহরণটি ভেরিয়েবলের ফলাফল আউটপুট করতে আমি ইস্যু করি:
fprintf(outFID, "%.15e\n", value);
বা
fwrite(&value, 1, sizeof(double), outFID);
এবং আমি ক্রমাগত পার্থক্যগুলি পেয়ে
যাব : 2.07843469652206 4 ই -16 বনাম 2.07843469652206 3 ই -16
আমি কেন এটি বুঝতে চেষ্টা করার জন্য অনেক সময় ব্যয় করেছি। আমি প্রথমে ভেবেছিলাম আমার একটি স্মৃতি চিপ খারাপ হয়ে গেছে, এবং আমি তাদের অর্ডার দিয়ে প্রতিস্থাপন করেছি, কোনও লাভ হয়নি ail পরে আমি সহকর্মীর লিনাক্স মেশিনেও আমার কোড চালানোর চেষ্টা করেছি এবং আমি একই প্রকৃতির পার্থক্য পেয়েছি।
কি এই সৃষ্টি হতে পারে? এটি এখন একটি ছোট সমস্যা, তবে আমি ভাবছি এটি "আইসবার্গের টিপ" (কোনও গুরুতর সমস্যার) কিনা।
আমি ভেবেছিলাম সংখ্যাসূচক মডেলগুলির সাথে কাজ করা কেউ যদি এই সমস্যাটি নিয়ে আসে তবে আমি স্ট্যাক ওভারফ্লোটির পরিবর্তে এখানে পোস্ট করব। যদি কেউ এই বিষয়ে আলোকপাত করতে পারে তবে আমি অনেক বেশি বাধ্য।
মন্তব্যে অনুসরণ:
ক্রিশ্চিয়ান ক্লাসন এবং বিক্রম: প্রথমে, আমার প্রশ্নের প্রতি আপনার মনোযোগ দেওয়ার জন্য আপনাকে ধন্যবাদ thank আপনি যে নিবন্ধগুলি সংযুক্ত করেছেন সেগুলি পরামর্শ দেয়: 1. গোলাকার ত্রুটিগুলি নির্ভুলতার সীমাবদ্ধ করে এবং 2. বিভিন্ন কোড (যেমন আপাতদৃষ্টিতে নিরীহ প্রিন্ট স্টেটমেন্টগুলি প্রবর্তন করা) মেশিনের অ্যাপসিলনের ফলাফলগুলিকে প্রভাবিত করতে পারে। আমার স্পষ্ট করে বলা উচিত যে আমি প্রভাব fwrite
এবং fprintf
ফাংশনগুলির তুলনা করছি না । আমি একটি বা অন্যটি ব্যবহার করছি। বিশেষত, একই এক্সিকিউটেবল উভয় রানের জন্য ব্যবহৃত হয়। আমি fprintf
ওআর ব্যবহার করি কিনা তা সহজভাবেই আমি বলছি fwrite
।
সুতরাং কোড পাথ (এবং এক্সিকিউটেবল) একই, এবং হার্ডওয়্যার একই। এই সমস্ত বাহ্যিক কারণ অবিচ্ছিন্নভাবে রাখা, এলোমেলোতা কোথা থেকে আসে, মূলত? আমি সন্দেহ করেছি যে ত্রুটিযুক্ত মেমরিটি কিছুটা সঠিকভাবে ধরে না রাখার কারণে বিট ফ্লিপ হয়েছিল, যার কারণেই আমি মেমরি চিপগুলি প্রতিস্থাপন করেছি, তবে এখানে বিষয়টি মনে হচ্ছে না, আমি যাচাই করেছিলাম এবং আপনি ইঙ্গিত করেছেন। আমার প্রোগ্রামটি হাজারে এই ডাবল নির্ভুলতার সংখ্যাগুলিকে একক রানে আউটপুট করে এবং সর্বদা একটি এলোমেলো মুঠোফুল থাকে যা এলোমেলো বিট ফ্লিপ করে।
ক্রিশ্চান ক্লাসনের প্রথম মন্তব্য অনুসরণ করুন: মেশিনের নির্ভুলতার মধ্যে 0 এর সমান কেন ? একটি ডাবলের জন্য ক্ষুদ্রতম ধনাত্মক সংখ্যাটি 2.22e-308, সুতরাং এটি 0 এর সমান হওয়া উচিত না? আমার প্রোগ্রাম 10 ^ -16 পরিসীমা (1e-15 থেকে 8e-17 এর মধ্যে) কয়েক হাজার মানকে আউটপুট করে এবং আমরা আমাদের গবেষণা প্রকল্পে অর্থবহ বিভিন্নতা দেখতে পেয়েছি, তাই আমি আশা করি আমরা অযৌক্তিকের দিকে তাকাব না নম্বর।
ফলোআপ # 2 :
মন্তব্যগুলিতে অফসুট আলোচনায় সহায়তা করার জন্য এটি মডেল দ্বারা টাইম সিরিজ আউটপুট দেওয়ার প্লট।