ভাসমানগুলির অ-নিরবচ্ছিন্ন যোগফল


10

আমাকে সুস্পষ্ট মুষ্টিটি বর্ণনা করতে দাও: আমি সম্পূর্ণরূপে বুঝতে পারি যে ভাসমান পয়েন্টের ধরণগুলি দশমিক মানগুলি সঠিকভাবে উপস্থাপন করতে পারে না । এটি যে সম্পর্কে না! তবুও, ভাসমান পয়েন্ট গণনাগুলি হ্রাসকারী বলে মনে করা হচ্ছে

এখন যেহেতু এটি অতিক্রম হয়েছে, আমি আপনাকে আজ উত্সাহিত কৌতূহলী কেসটি দেখাব। আমার কাছে ভাসমান-পয়েন্টের মানগুলির একটি তালিকা রয়েছে এবং আমি সেগুলি যোগ করতে চাই:

CREATE TABLE #someFloats (val float);
INSERT INTO #someFloats (val) VALUES (1), (1), (1.2), (1.2), (1.2), (3), (5);

SELECT STR(SUM(#someFloats.val), 30, 15) FROM #someFloats;

DROP TABLE #someFloats;

-- yields:
--   13.600000000000001

এতক্ষণ, এত ভাল - এখানে কোনও আশ্চর্যের কিছু নেই। আমরা সকলেই জানি যে 1.2বাইনারি উপস্থাপনে হুবহু উপস্থাপন করা যায় না, সুতরাং "অসম্পূর্ণ" ফলাফলটি প্রত্যাশিত।

আমি যখন অন্য টেবিলে বাম-যোগদান করি তখন নিম্নলিখিত অদ্ভুত জিনিসটি ঘটে:

CREATE TABLE #A (a int);
INSERT INTO #A (a) VALUES (1), (2);

CREATE TABLE #someFloats (val float);
INSERT INTO #someFloats (val) VALUES (1), (1), (1.2), (1.2), (1.2), (3), (5);

SELECT #A.a, STR(SUM(#someFloats.val), 30, 15)
  FROM #someFloats LEFT JOIN #A ON 1 = 1
 GROUP BY #A.a;

DROP TABLE #someFloats;
DROP TABLE #A;

-- yields
--   1   13.600000000000001
--   2   13.599999999999998

( বর্গফুট স্কিডল , আপনি সেখানে কার্যকর করার পরিকল্পনা দেখতেও পারেন)

আমি একই ওভার সমষ্টি একই মান, কিন্তু একটি ভিন্ন ফ্লোটিং পয়েন্ট ত্রুটি। আমি যদি টেবিলটিতে আরও সারি যুক্ত করি তবে #Aআমরা দেখতে পাব যে মানটি দুটি মানের মধ্যে বিকল্প হয়। আমি কেবল এই সমস্যাটি একটি দিয়ে পুনরায় উত্পাদন করতে সক্ষম হয়েছি LEFT JOIN; INNER JOINএখানে প্রত্যাশা মত কাজ করে।

এটি অসুবিধাগুলি, কারণ এর অর্থ হ'ল ক DISTINCT, GROUP BYবা PIVOTতাদের বিভিন্ন মান হিসাবে দেখায় (যা আসলে আমরা এই সমস্যাটি কীভাবে আবিষ্কার করেছি)।

সুস্পষ্ট সমাধান হ'ল মানটি গোল করা, কিন্তু আমি কৌতূহল: এই আচরণের জন্য কি কোনও যৌক্তিক ব্যাখ্যা আছে?

উত্তর:


15

প্রকৃতপক্ষে, আপনি যে লিঙ্কটির কথা উল্লেখ করছেন সেটি হ'ল না যে ভাসমান পয়েন্ট গণিতের গণনা সর্বদা নির্বিচারক। প্রকৃতপক্ষে, উত্তরের একটিতে এটি উল্লেখ করা হয়েছে যে সংযোজনটি সংঘবদ্ধ নয় (অর্থ (a + b) + cঅগত্যা সমান হয় না a + (b + c)), যা এই উত্তরেও বলা হয় ।

স্ট্রিম একীকরণ যদি প্রতিটি গোষ্ঠীর সারিগুলি বিভিন্ন ক্রমে প্রক্রিয়া করতে ঘটে - যা এসকিউএল সার্ভারটি সাধারণত নিখরচায় থাকে; যদি ORDER BYউপযুক্ত ধারাটিতে কোনও না থাকে, তবে অপ্টিমাইজারটি যে কোনও স্ক্যান বা অনুসন্ধান বা অন্য কোয়েরি অপারেটরটি সবচেয়ে দ্রুত হবে তা চয়ন করবে, তাতে কোন ক্রম সংযোজন সম্পাদন করে তা নির্বিশেষে - তবে এটি আপনার পর্যবেক্ষণের আচরণটি ব্যাখ্যা করতে পারে।

সংযোজন সর্বদা নির্দ্বিধায় থাকে: আপনি একই দুটি ভাসা রেখেছিলেন, আপনি একই ফ্লোটটি পেয়ে যাবেন। তবে ভিন্ন ক্রমে একসাথে ভাসা যুক্ত করা আলাদা ফলাফল দিতে পারে।


অ্যাসোসিয়েটিভিটির নির্ধারণবাদের সাথে কোনও সম্পর্ক নেই, সুতরাং বিটটি বিভ্রান্তিকর।
মাকিং হাঁস

ভাসমান পয়েন্ট সংযোজনের অ- SUM()সাহচর্যতা এসকিউএল সার্ভারের সামগ্রিক ফাংশনটির অ- নিরস্তামূলক আচরণের দিকে পরিচালিত করে , আপনি কি @ মুইংডাককে সম্মত করবেন?
মোস্তাকাসিও

কোন? পূর্ণসংখ্যা বিভাগ একটি স্পষ্ট কাউন্টারিক্স নমুনা। এটি অ-সাহসী, তবে সম্পূর্ণরূপে নির্বিচারবাদী। তেমনি, ভাসমান পয়েন্ট বিভাগটি অ-সহযোগী এবং তবুও নির্বিচারবাদী হওয়া উচিত। এর থেকে, আমরা সিদ্ধান্ত নিয়েছি যে এটি অযৌক্তিক এবং তবুও নির্বিচারবাদী হওয়ার জন্য যুক্তিসঙ্গত। বলা হচ্ছে, সংযোজনগুলির ক্রম যদি সংজ্ঞাবাদী না হয়, তবে ফলাফলটি একইভাবে নির্বিচারবাদী হবে না, তাই আপনার প্রথম এবং শেষ বাক্যটি নির্বিশেষে এখনও সঠিক।
হাঁসকে

SUM()ভাসমান পয়েন্ট আর্গুমেন্টগুলি নিয়ে এসকিউএল সার্ভারের জন্য পূর্ণসংখ্যা বিভাগ একটি কাউন্টারেরেক্সামাল , ঠিক কীভাবে?
মোস্তাক্সিয়ো

1
পূর্ণসংখ্যা বিভাগ অ-সাহসী এবং নির্মূলবাদী। অতএব, গাণিতিক অপারেশন সাহিত্যিকতা নির্ধারণের সাথে সম্পর্কিত নয়। অতএব কোনও অ- SUM()সাহচিক্যতা অবশ্যই এটি নির্ধারণের প্রতি অপ্রাসঙ্গিক হতে হবে। আমি সম্মত হই যে SUMনির্দ্বিধাগ্রস্থ বলে মনে হচ্ছে, তবে আপনার অস্পষ্টতা সম্পর্কিত উল্লেখগুলি অপসারণ করা উচিত, কারণ এটি সম্পর্কিত নয় re
মাকিং হাঁস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.