`ভেক্টরটি <ফ্লাট> করা উচিত quএকটিই প্রতিবিম্বিত হতে পারে বা এটি আইইইই 754 শব্দার্থবিজ্ঞান অনুসরণ করা উচিত?


9

সমতার জন্য ভাসমান পয়েন্টের মানগুলির তুলনা করার সময়, দুটি পৃথক পদ্ধতি রয়েছে:

সি # ( 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 তে এই জাতীয় ভেক্টর প্রবর্তন করার পরিকল্পনা করেছে। আমার বিপরীতে তারা আইইইই সমাধানটি পছন্দ করেন , মূলত পারফরম্যান্স সুবিধার কারণে। যেহেতু চূড়ান্ত প্রকাশের পরে এই জাতীয় সিদ্ধান্ত অবশ্যই পরিবর্তন করা হবে না, তাই আমি সম্প্রদায়ের কাছ থেকে মতামত পেতে চাই, আমি কী একটি বড় ভুল বলে বিশ্বাস করি।


1
দুর্দান্ত এবং চিন্তার উদ্রেককারী প্রশ্ন। আমার জন্য (কমপক্ষে), এটি বোঝা যায় না ==এবং Equalsবিভিন্ন ফলাফল ফিরে আসবে। অনেক প্রোগ্রামার অনুমান তারা, এবং না একই জিনিস । তদ্ব্যতীত - সাধারণভাবে, সমতা-অপারেটরগুলির প্রয়োগগুলি Equalsপদ্ধতিটির প্রতি আহ্বান জানায় । আপনি যুক্তি দিয়েছিলেন যে একজনকে একটি অন্তর্ভুক্ত করা যেতে পারে IeeeEqualsতবে একটি এটি অন্য ReflexiveEqualsউপায়েও করতে পারে এবং একটি- স্মৃতিকে অন্তর্ভুক্ত করতে পারে । Vector<float>টাইপ ব্যবহার করা যেতে পারে অনেক কর্মক্ষমতা-সমালোচনামূলক অ্যাপ্লিকেশন, এবং সেই অনুযায়ী অপ্টিমাইজ করা উচিত নয়।
মর মাউস

@ ডিমেয়াস কিছু কারণের জন্য কেন আমাকে এটি বিশ্বাসযোগ্য নয়: 1) float/ doubleএবং বিভিন্ন ধরণের ==এবং Equalsইতিমধ্যে পৃথক। আমি মনে করি যে বিদ্যমান ধরণেরগুলির সাথে একটি অসামঞ্জস্যতা এর মধ্যে অসামঞ্জস্যতার চেয়ে আরও বিভ্রান্তিকর হবে ==এবং Equalsআপনাকে অন্য ধরণের ক্ষেত্রে এখনও মোকাবেলা করতে হবে। 2) খুব সুন্দরভাবে সমস্ত জেনেরিক অ্যালগরিদম / সংগ্রহগুলি ব্যবহার করে Equalsএবং এটির কাজ করার জন্য তার রেফ্লেক্সিভিটির উপর নির্ভর করে (লিনকুই এবং অভিধান), যেখানে কংক্রিটের ভাসমান-পয়েন্ট অ্যালগরিদমগুলি সাধারণত ==তাদের আইআইইই শব্দার্থবিজ্ঞানগুলি পায় সেখানে ব্যবহার করে ।
কোডসইনচওস

আমি Vector<float>সাধারণ floatবা এর চেয়ে আলাদা "জন্তু" হিসাবে বিবেচনা করব double। এই পরিমাপের দ্বারা আমি অপারেটরকে তাদের মান মেনে চলার কারণ Equalsবা দেখতে পাচ্ছি না ==। আপনি নিজেই বলেছিলেন: "আপনি যদি অভিধান কী হিসাবে ভাসা ভাসা ব্যবহার করছেন তবে আপনি পাপের অবস্থায় বাস করছেন এবং বুদ্ধিমান আচরণের আশা করা উচিত নয়"। যদি NaNকোনও অভিধানে সংরক্ষণ করা হয়, তবে এটি ভয়ানক অনুশীলন ব্যবহারের জন্য তাদের নিজস্ব godশ্বরের দোষ। আমি দৃly়ভাবে মনে করি যে কোরএফএক্স-দল এটির মাধ্যমে এটি ভাবেনি। আমি ReflexiveEqualsকেবল পারফরম্যান্সের জন্যই বা অন্য সাথে যেতে চাই ।
মর মাউস

উত্তর:


5

আমি যুক্তি দিয়ে বলব যে আইইইই আচরণটি সঠিক। NaNs কোনওভাবেই একে অপরের সমতুল্য নয়; তারা অশুভ-সংজ্ঞায়িত শর্তের সাথে মিল রেখে যেখানে একটি উত্তরিক উত্তর যথাযথ নয়।

বিয়ন্ড কর্মক্ষমতা সুবিধা আইইইই গাণিতিক ব্যবহার থেকে আসা যে অধিকাংশ প্রসেসর নেটিভ সমর্থন আমার মনে হয় এই বলে যে যদি সঙ্গে একটি শব্দার্থিক সমস্যা isnan(x) && isnan(y), তারপর x == y। এই ক্ষেত্রে:

// C++
double inf = std::numeric_limits<double>::infinity();
double x = 0.0 / 0.0;
double y = inf - inf;

আমি যুক্তি দিয়ে বলব যে কেন কোনও xসমান বিবেচনা করার কোনও অর্থবহ কারণ নেই y। আপনি খুব কমই এই সিদ্ধান্তে পৌঁছাতে পারলেন যে এগুলি সমান সংখ্যার; এগুলি মোটেও সংখ্যা নয়, সুতরাং এটি সম্পূর্ণরূপে একটি অবৈধ ধারণা বলে মনে হচ্ছে।

তদুপরি, একটি এআইপি ডিজাইনের দৃষ্টিকোণ থেকে, আপনি যদি অনেক প্রোগ্রামার দ্বারা ব্যবহারের উদ্দেশ্যে একটি সাধারণ-উদ্দেশ্য গ্রন্থাগারটিতে কাজ করে থাকেন তবে সর্বাধিক শিল্প-টিপিকাল ভাসমান-পয়েন্ট শব্দার্থক শব্দটি ব্যবহার করা বোধগম্য। একটি ভাল গ্রন্থাগারের লক্ষ্য হ'ল যারা এটি ব্যবহার করেন তাদের জন্য সময় সাশ্রয় করা, সুতরাং অমান্যকর আচরণে বিল্ডিং বিভ্রান্তির জন্য উপযুক্ত।


3
এটি NaN == NaNমিথ্যা ফিরে আসা উচিত অবিসংবাদিত। প্রশ্নটি কী .Equalsপদ্ধতিটি করা উচিত। উদাহরণস্বরূপ, যদি আমি NaNঅভিধান কী হিসাবে ব্যবহার করি তবে যুক্ত মানটি NaN.Equals(NaN)প্রত্যাবর্তনযোগ্য হয়ে যায় যদি মিথ্যা ফেরত দেয়।
কোডসইনচাউস

1
আমি মনে করি আপনি সাধারণ ক্ষেত্রে উপযুক্ত হতে হবে। সংখ্যার ভেক্টরের সাধারণ ক্ষেত্রে হ'ল থ্রুপুট সংখ্যামূলক গণনা (প্রায়শই সিমডি নির্দেশাবলীর সাথে অনুকূলিতকরণ)। আমি যুক্তি দিয়ে বলতে পারি যে অভিধান কী হিসাবে ভেক্টর ব্যবহার করা অত্যন্ত বিরল ব্যবহারের কেস এবং আপনার শব্দার্থবিজ্ঞানের চারপাশে নকশা করা খুব কমই কার্যকর। Counterargument যে আমার কাছে সবচেয়ে যুক্তিযুক্ত মনে হয়, দৃঢ়তা, যেহেতু বিদ্যমান Single, Doubleইত্যাদি শ্রেণীর ইতিমধ্যে আত্মবাচক আচরণ আছে। আইএমএইচও, এটাই শুরু করার ভুল সিদ্ধান্ত ছিল। তবে আমি কমনীয়তাকে দরকারীতার / গতির পথে যেতে দেব না।
জেসন আর

তবে সংখ্যার গণনাগুলি সাধারণত ব্যবহার করবে ==যা সর্বদা আইইইই অনুসরণ করে, সুতরাং কীভাবে Equalsপ্রয়োগ করা হয় না কেন তারা দ্রুত কোড পেতে চাইবে । আইএমও পৃথক Equalsপদ্ধতি থাকার পুরো পয়েন্টটি অ্যালগরিদমে ব্যবহার করছে যা কংক্রিটের ধরণের যেমন লিনকিউ এর Distinct()ফাংশন সম্পর্কে চিন্তা করে না ।
CodeInChaos

1
আমি তা পেয়েছি তবে আমি এমন একটি এপিআই-এর বিরুদ্ধে তর্ক করব যাতে ==অপারেটর এবং একটি Equals()ফাংশন রয়েছে যা বিভিন্ন শব্দার্থবিজ্ঞান রয়েছে। আমি মনে করি আপনি কোনও বিকাশকারী দৃষ্টিকোণ থেকে সম্ভাব্য বিভ্রান্তির কোনও মূল্য পরিশোধ করছেন, কোনও আসল সুবিধা নেই (অভিধানের কী হিসাবে সংখ্যার ভেক্টর ব্যবহার করতে সক্ষম হওয়ার জন্য আমি কোনও মূল্য নির্ধারণ করি না)। এটা আমার মতামত; আমি মনে করি না হাতে থাকা প্রশ্নের একটি উদ্দেশ্যমূলক উত্তর আছে।
জেসন আর

0

একটি সমস্যা আছে: আইইইই 7575৫ সংখ্যামূলক অ্যাপ্লিকেশনগুলির সাথে উপযুক্তভাবে উপযুক্ত এমনভাবে রিলেশনাল ক্রিয়াকলাপ এবং সাম্যতার সংজ্ঞা দেয়। এটি বাছাই এবং হ্যাশিংয়ের পক্ষে খুব উপযুক্ত নয়। সুতরাং আপনি যদি সংখ্যাসূচক মানের উপর ভিত্তি করে একটি অ্যারে বাছাই করতে চান বা আপনি যদি একটি সেটে সংখ্যাসূচক মান যুক্ত করতে চান বা অভিধানে কী হিসাবে ব্যবহার করতে চান তবে আপনি ঘোষণা করুন যে এনএএন মান অনুমোদিত নয়, অথবা আপনি আইইইই 754 ব্যবহার করেন না অন্তর্নির্মিত অপারেশন। আপনার হ্যাশ টেবিলটি নিশ্চিত করতে হবে যে সমস্ত NaN একই মানের সাথে মিলছে এবং একে অপরের সাথে সমান তুলনা করে।

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


1
আমি সম্মত হই যে সংখ্যার উদ্দেশ্যগুলি আরও গুরুত্বপূর্ণ। তবে ইতিমধ্যে তাদের জন্য আমাদের ==!=অপারেটর রয়েছে। আমার অভিজ্ঞতায় Equalsপদ্ধতিটি কেবলমাত্র অ অংকিত অ্যালগোরিদম দ্বারা ব্যবহৃত হয়।
কোডসইনচওস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.