আজ আমি কয়েকটি সি ++ কোড (অন্য কারো দ্বারা লিখিত) সন্ধান করছিলাম এবং এই বিভাগটি পেয়েছি:
double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}
আমি এটি বোঝার চেষ্টা করছি যে এটি এমনকি অর্থবোধ করে কিনা।
এর জন্য ডকুমেন্টেশন epsilon()
বলেছেন:
ফাংশনটি 1 টির চেয়ে বড় মানের এবং 1 টির চেয়েও ছোট মানের পার্থক্যটি প্রদান করে যা [দ্বিগুণ দ্বারা] উপস্থাপনযোগ্য।
এটি 0-তেও প্রযোজ্য, অর্থাৎ epsilon()
ক্ষুদ্রতম মানটি 0 এর চেয়ে বেশি? বা এর মধ্যে সংখ্যা রয়েছে 0
এবং 0 + epsilon
এটি একটি দ্বারা প্রতিনিধিত্ব করা যেতে পারে double
?
তা না হলে তুলনা কি সমান নয় someValue == 0.0
?
numeric_limits<>::epsilon
বিভ্রান্তিকর এবং অপ্রাসঙ্গিক। আমরা যা চাই তা 0 ধরে নেওয়া উচিত যদি আসল মান 0 থেকে কিছুটা আলাদা হয় না And এবং ε সমস্যার স্পেসিফিকেশনের ভিত্তিতে বেছে নেওয়া উচিত, কোনও মেশিন-নির্ভর মানের উপর ভিত্তি করে নয়। আমি সন্দেহ করতে পারি যে বর্তমান এপসিলন অকেজো, এমনকি মাত্র কয়েকটি এফপি অপারেশন এর চেয়েও বেশি ত্রুটি জমা করতে পারে।