সমতার জন্য ভাসমান পয়েন্টের মানগুলির তুলনা করার সময়, দুটি পৃথক পদ্ধতি রয়েছে:
NaNনিজের সমান নয়, যা আইইইই 754 নির্দিষ্টকরণের সাথে মেলে ।NaNনিজের সমতুল্য হওয়া, যা প্রতিচ্ছবিটির গাণিতিক সম্পত্তি সরবরাহ করে যা সাম্য সম্পর্কের সংজ্ঞার জন্য প্রয়োজনীয়
সি # ( floatএবং double) এ আইইইই ভাসমান পয়েন্টের ধরণগুলি অন্তর্নির্মিত ==এবং !=(এবং সম্পর্কিত অপারেটরগুলি পছন্দ করে <) এর জন্য আইইইই শব্দার্থবিজ্ঞান অনুসরণ করে তবে object.Equals, IEquatable<T>.Equals(এবং CompareTo) এর জন্য প্রতিবিম্ব নিশ্চিত করে ।
এখন একটি লাইব্রেরি বিবেচনা করুন যা float/ এর উপরে ভেক্টর স্ট্রাক্ট সরবরাহ করে double। এ জাতীয় ভেক্টর টাইপ ওভারলোড ==/ !=এবং ওভাররাইড object.Equals/ করবে IEquatable<T>.Equals।
কি সবাই সম্মত হয় যে হয় ==/ !=আইইইই শব্দার্থবিদ্যা অনুসরণ করা উচিত। প্রশ্নটি হ'ল, এই জাতীয় গ্রন্থাগারটি কীভাবে Equalsপদ্ধতিটি (যা সাম্যতা অপারেটরদের থেকে পৃথক) বাস্তবায়িত করবে যা এমন একটি উপায়ে প্রতিবিম্বিত বা আইইইই শব্দার্থবিজ্ঞানের সাথে মেলে এমনভাবে?
আইইইই শব্দার্থ ব্যবহারের জন্য যুক্তিগুলি Equals:
- এটি আইইইই 754 অনুসরণ করে
এটি (সম্ভবত অনেক বেশি) দ্রুত কারণ এটি সিমডি নির্দেশের সুবিধা নিতে পারে
আপনি সিমডি নির্দেশাবলী এবং তার কার্যকারিতা প্রভাব ব্যবহার করে কীভাবে প্রতিচ্ছবিবদ্ধ সমতা প্রকাশ করবেন সে সম্পর্কে স্ট্যাকওভারফ্লোতে আমি একটি পৃথক প্রশ্ন জিজ্ঞাসা করেছি: ভাসমান পয়েন্ট সমতা তুলনা করার জন্য সিমডি নির্দেশাবলী
আপডেট: দেখে মনে হচ্ছে তিনটি সিমড নির্দেশাবলী ব্যবহার করে দক্ষতার সাথে প্রতিচ্ছবি সমতা প্রয়োগ করা সম্ভব।
Equalsভাসমান পয়েন্ট জড়িত থাকার জন্য ডকুমেন্টেশনটির প্রতিচ্ছবি প্রয়োজন হয় না:সমান (অবজেক্ট) পদ্ধতির সমস্ত প্রয়োগের জন্য নিম্নলিখিত বিবৃতিগুলি অবশ্যই সত্য। তালিকায়
x,yএবংzবস্তুর রেফারেন্স যে নাল নয় প্রতিনিধিত্ব করে।x.Equals(x)trueফ্লোটিং-পয়েন্ট প্রকারের ক্ষেত্রে জড়িত ক্ষেত্রে ব্যতীত রিটার্ন দেয় । আইএসও / আইইসি / আইইইই 60559: 2011, তথ্য প্রযুক্তি - মাইক্রোপ্রসেসর সিস্টেম - ভাসমান-পয়েন্ট পাটিগণিত দেখুন।যদি আপনি অভিধান কী হিসাবে ভাসা ব্যবহার করছেন আপনি পাপ অবস্থায় বাস করছেন এবং বুদ্ধিমান আচরণের আশা করা উচিত নয়।
রিফ্লেসিটিভ হওয়ার পক্ষে যুক্তি:
এটা তোলে সহ বিদ্যমান ধরনের, সঙ্গে সামঞ্জস্যপূর্ণ এর
Single,Double,TupleএবংSystem.Numerics.Complex।আমি ছাত্রলীগের এমন কোন নজির জানি না যেখানে
Equalsপ্রতিচ্ছবি হওয়ার পরিবর্তে আইইইই অনুসরণ করে। কাউন্টার উদাহরণ হলSingle,Double,TupleএবংSystem.Numerics.Complex।Equalsবেশিরভাগ পাত্রে এবং অনুসন্ধান অ্যালগরিদম দ্বারা ব্যবহৃত হয় যা প্রতিচ্ছবি উপর নির্ভর করে। এই অ্যালগরিদমের জন্য যদি তাদের কাজ করা থেকে বাধা দেয় তবে পারফরম্যান্স লাভ অপ্রাসঙ্গিক। পারফরম্যান্সের জন্য নির্ভুলতা ত্যাগ করবেন না।- এটা সব হ্যাশ ভিত্তিক সেট এবং অভিধান ভঙ্গ,
Contains,Find,IndexOfবিভিন্ন সংগ্রহের / LINQ, সেট ভিত্তিক LINQ অপারেশন (চালুUnion,Exceptইত্যাদি) যদি তথ্য ধারণ করেNaNমান। আইইইই শব্দার্থক গ্রহণযোগ্য যেখানে প্রকৃত গণনাগুলি করে এমন কোডটি সাধারণত কংক্রিটের ধরণের এবং ব্যবহার (
==/!=বা সম্ভবত সম্ভবত এপসিলন তুলনা) ব্যবহার করে।জেনেরিকগুলি ব্যবহার করে আপনি বর্তমানে উচ্চ কার্যকারিতা গণনা লিখতে পারবেন না যেহেতু এর জন্য আপনার গাণিতিক ক্রিয়াকলাপ প্রয়োজন তবে এগুলি ইন্টারফেস / ভার্চুয়াল পদ্ধতির মাধ্যমে উপলভ্য নয়।
সুতরাং একটি ধীর
Equalsপদ্ধতিটি বেশিরভাগ উচ্চ পারফরম্যান্স কোডকে প্রভাবিত করবে না।আপনার ক্ষেত্রে আইইইই শব্দার্থবিজ্ঞানের প্রয়োজন হয় বা আপনার পারফরম্যান্স সুবিধা অর্জন করতে হবে সে ক্ষেত্রে একটি
IeeeEqualsপদ্ধতি বা একটি সরবরাহ করা সম্ভবIeeeEqualityComparer<T>।
আমার মতে এই যুক্তিগুলি দৃ strongly ়ভাবে একটি প্রতিচ্ছবি বাস্তবায়নের পক্ষপাতী।
মাইক্রোসফ্টের কোরএফএক্স টিম .NET তে এই জাতীয় ভেক্টর প্রবর্তন করার পরিকল্পনা করেছে। আমার বিপরীতে তারা আইইইই সমাধানটি পছন্দ করেন , মূলত পারফরম্যান্স সুবিধার কারণে। যেহেতু চূড়ান্ত প্রকাশের পরে এই জাতীয় সিদ্ধান্ত অবশ্যই পরিবর্তন করা হবে না, তাই আমি সম্প্রদায়ের কাছ থেকে মতামত পেতে চাই, আমি কী একটি বড় ভুল বলে বিশ্বাস করি।
float/ doubleএবং বিভিন্ন ধরণের ==এবং Equalsইতিমধ্যে পৃথক। আমি মনে করি যে বিদ্যমান ধরণেরগুলির সাথে একটি অসামঞ্জস্যতা এর মধ্যে অসামঞ্জস্যতার চেয়ে আরও বিভ্রান্তিকর হবে ==এবং Equalsআপনাকে অন্য ধরণের ক্ষেত্রে এখনও মোকাবেলা করতে হবে। 2) খুব সুন্দরভাবে সমস্ত জেনেরিক অ্যালগরিদম / সংগ্রহগুলি ব্যবহার করে Equalsএবং এটির কাজ করার জন্য তার রেফ্লেক্সিভিটির উপর নির্ভর করে (লিনকুই এবং অভিধান), যেখানে কংক্রিটের ভাসমান-পয়েন্ট অ্যালগরিদমগুলি সাধারণত ==তাদের আইআইইই শব্দার্থবিজ্ঞানগুলি পায় সেখানে ব্যবহার করে ।
Vector<float>সাধারণ floatবা এর চেয়ে আলাদা "জন্তু" হিসাবে বিবেচনা করব double। এই পরিমাপের দ্বারা আমি অপারেটরকে তাদের মান মেনে চলার কারণ Equalsবা দেখতে পাচ্ছি না ==। আপনি নিজেই বলেছিলেন: "আপনি যদি অভিধান কী হিসাবে ভাসা ভাসা ব্যবহার করছেন তবে আপনি পাপের অবস্থায় বাস করছেন এবং বুদ্ধিমান আচরণের আশা করা উচিত নয়"। যদি NaNকোনও অভিধানে সংরক্ষণ করা হয়, তবে এটি ভয়ানক অনুশীলন ব্যবহারের জন্য তাদের নিজস্ব godশ্বরের দোষ। আমি দৃly়ভাবে মনে করি যে কোরএফএক্স-দল এটির মাধ্যমে এটি ভাবেনি। আমি ReflexiveEqualsকেবল পারফরম্যান্সের জন্যই বা অন্য সাথে যেতে চাই ।
==এবংEqualsবিভিন্ন ফলাফল ফিরে আসবে। অনেক প্রোগ্রামার অনুমান তারা, এবং না একই জিনিস । তদ্ব্যতীত - সাধারণভাবে, সমতা-অপারেটরগুলির প্রয়োগগুলিEqualsপদ্ধতিটির প্রতি আহ্বান জানায় । আপনি যুক্তি দিয়েছিলেন যে একজনকে একটি অন্তর্ভুক্ত করা যেতে পারেIeeeEqualsতবে একটি এটি অন্যReflexiveEqualsউপায়েও করতে পারে এবং একটি- স্মৃতিকে অন্তর্ভুক্ত করতে পারে ।Vector<float>টাইপ ব্যবহার করা যেতে পারে অনেক কর্মক্ষমতা-সমালোচনামূলক অ্যাপ্লিকেশন, এবং সেই অনুযায়ী অপ্টিমাইজ করা উচিত নয়।