ভাসা এবং দশমিক ডেটা ধরণের মধ্যে পার্থক্য


175

আমি যখন মাইএসকিউএলে ভাসা এবং দশমিক ডেটা ধরণের ব্যবহার করি তখন কী পার্থক্য হয়?

আমি কখন ব্যবহার করব?


ব্যবহার করবেন না FLOAT(m,n), এটি দুটি বৃত্তাকার দিকে নিয়ে যায়; ইতিমধ্যে, এটি কোনও ব্যবহারের কিছুই সরবরাহ করে না।
রিক জেমস

উত্তর:


185

এই আমি কী পেয়েছি যখন আমি এই সন্দেহ ছিল।

mysql> create table numbers (a decimal(10,2), b float);
mysql> insert into numbers values (100, 100);
mysql> select @a := (a/3), @b := (b/3), @a * 3, @b * 3 from numbers \G
*************************** 1. row ***************************
  @a := (a/3): 33.333333333
  @b := (b/3): 33.333333333333
@a + @a + @a: 99.999999999000000000000000000000
@b + @b + @b: 100

দশমিক এই ক্ষেত্রে কী করা উচিত ঠিক তা করেছিল, এটি বাকী অংশ কেটে ফেলেছে, এভাবে 1/3 অংশ হারাবে।

সুতরাং অঙ্কের জন্য দশমিকটি আরও ভাল তবে বিভাগগুলির জন্য অবশ্যই কিছুটা অবধি অবশ্যই ভাসমানটি ভাল। মানে, ডেসিমাল ব্যবহার করা আপনাকে কোনও উপায়েই "ব্যর্থ প্রমাণ গাণিতিক" দেবে না।

আশাকরি এটা সাহায্য করবে.


4
একটি দুর্দান্ত পরীক্ষা। বহু বছর আগে সি লিবের ডেটা রূপান্তর ফাংশনগুলি প্রায়শই ASCII থেকে রূপান্তরিত মানগুলিতে কয়েক মিনিটের পার্থক্য তৈরি করে যখন এসকিউএল সার্ভারের সাথে তুলনা করা হয়। এটি আর খুব কমই সত্য। টেস্টিং হ'ল সেরা নীতি, কারণ ট্রেড-অফগুলি কী কী তা নির্দিষ্ট করে জানাই ভাল।

15
আসলে, ডেসিমাল সংযোজনটি ত্রুটিযুক্ত। আপনি যদি 33.333333333 তিনবার যোগ করেন তবে আপনি 100 পাবেন না you একটি ক্যালকুলেটর এবং এটি চেষ্টা করুন। যৌক্তিকরূপে আমরা জানি 1/3 + 1/3 + 1/3 3/3 য় IE: 1 এর সমান হওয়া উচিত, তবে এই শ্রেণীর যুক্তিযুক্ত সংখ্যাগুলি আমাদের এটি করতে দেয় না flo ফ্লোট উত্তরটি সঠিক, তবে আপনার অ্যাকাউন্টেন্ট এটি ঘৃণা করবে !
ব্যবহারকারী 2548100

5
@a99.999999999000000000000000000000 ডেসিমাল দিচ্ছেন না ? যা প্রযুক্তিগতভাবে সঠিক।
ভিনসেন্ট পোইরিয়ার

78

বেশিরভাগ পরিবেশে একটি "ফ্লোট" বাইনারি ফ্লোটিং-পয়েন্ট টাইপ। এটি নির্ভুলভাবে বেস -২ মানগুলি (একটি নির্দিষ্ট বিন্দুতে) সঞ্চয় করতে পারে তবে অনেকগুলি বেস -10 (দশমিক) মান সঠিকভাবে সঞ্চয় করতে পারে না। বৈজ্ঞানিক গণনার জন্য ভাসমানগুলি সবচেয়ে উপযুক্ত। এগুলি বেশিরভাগ ব্যবসায়িক ভিত্তিক গণিতের পক্ষে উপযুক্ত নয় এবং ফ্লোটগুলির অনুপযুক্ত ব্যবহার আপনাকে দংশন করবে। বহু দশমিক মান হুবহু বেস -২ তে উপস্থাপন করা যায় না। 0.1উদাহরণস্বরূপ, পারে না এবং তাই আপনি দেখতে পছন্দ করেন এমন অদ্ভুত ফলাফল 1.0 - 0.1 = 0.8999999

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


@ মিশেল পেট্রোত্তা - ব্যবহারকারী কেবলমাত্র তার দশমিক সংখ্যাগুলি ফর্মগুলিতে প্রদত্ত ক্ষেত্রটিতে প্রবেশ করেছেন .. আমার কেবল সেগুলি ডিবিতে সংরক্ষণ করা দরকার। যা আরও উপযুক্ত হবে। ?
হ্যাকার

12
@ প্রদীপ: আমার মনে হচ্ছে আপনি আমার প্রশ্নের উত্তর দিচ্ছেন না। এটি হতে পারে কারণ আপনি নিজের উত্তরগুলি নিজেরাই জানেন না - সম্ভবত আপনি নিজের ব্যবস্থাপক বা গ্রাহককে আরও বিশদে জিজ্ঞাসা করতে স্বাচ্ছন্দ্য বোধ করেন না। যদি এটি হয় তবে আমি বুলেটটি কামড়ানোর পরামর্শ দিচ্ছি, কয়েক ঘন্টার জন্য তাদের সাথে বসে এবং সত্যিই আপনার অ্যাপ্লিকেশনটি চালিয়ে যাচ্ছি। ঠিক কী এবং দুর্দান্ত বিশদে আপনার ডেটা ব্যবহার করা হচ্ছে?
মাইকেল পেট্রোটা

1
আসলে, বর্তমানে ভাসমান এবং ডেসিমাল উভয়ই তাদের সংখ্যা একইভাবে সঞ্চয় করে। পার্থক্যটি কীভাবে এই সংখ্যাগুলি ব্যবহৃত হয়। ডেসিমাল একটি বিহিত দশমিক বিন্দু সহ কোনও দুটির পরিপূরক পূর্ণসংখ্যাকে সমন্বিত করতে সমস্ত বিট ব্যবহার করে। একটি ভাসমানের দুটি পূর্ণসংখ্যা থাকে এবং একটি অন্যটিকে একটি শক্তিতে উত্থাপন করে। বেস এবং এক্সপোঞ্জার উভয়ই দুটি পরিপূরক পূর্ণসংখ্যা হয়।
ব্যবহারকারী 2548100

1
আমি মনে করি আপনার উত্তরটি প্রযুক্তিগতভাবে সঠিক হতে পারে তবে ভাসমান বাইনারি ধরণের হওয়ার উপর জোর দেওয়া বিষয়টি এই বিষয়টিকে অস্পষ্ট করে দেয় যে তারা উভয়ই তাদের ডেটা একই ফর্ম্যাটে সঞ্চয় করে। প্রথম শক্তিতে উত্থিত একটি ভাসমান পয়েন্ট সংখ্যাটি একটি পূর্ণসংখ্যা এবং ঠিক সেভাবে সংরক্ষণ করা হয়। প্রকৃতপক্ষে, 80-বিট নির্ভুলতা ভাসার জন্য, বেসটি একটি int64 হয়। বিপরীতে, আপনি যদি পূর্ণসংখ্যার জন্য একটি গ্রন্থাগার লিখেছিলেন যা তাদের ক্ষমতায় উন্নীত করেছে, আপনি একই সমস্যাটি পূর্ণসংখ্যার, বা ডেসিমালস, বা রোমান নাম্বার বা ললিপপসের সাথে সম্মুখীন হতে পারেন। এটি স্টোরেজ নয় যা "রাউন্ডিং ত্রুটি" তৈরি করছে, এটি গ্রন্থাগারের গণিতটি পরিচালনা করছে।
ব্যবহারকারী 2548100

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

21

মাইএসকিউএল সম্প্রতি তাদের ডেসিমাল ধরণের স্টোরটি বদলেছে । অতীতে তারা প্রতিটি সংখ্যার জন্য একটি সংখ্যার - বনাম - একটি দুজনের পরিপূরক পূর্ণসংখ্যার বা এর থেকে প্রাপ্ত কিছু সংখ্যার উপস্থাপনার সমন্বয়ে প্রতিটি অঙ্কের জন্য অক্ষর (বা nybbles) সংরক্ষণ করে।

DECIMAL- র জন্য বর্তমান স্টোরেজ ফর্ম্যাটটি 1,2,3, বা 4-বাইট পূর্ণসংখ্যার একটি সিরিজ, যার বিটগুলি আপনার দ্বারা সংজ্ঞায়িত একটি আবদ্ধ দশমিক বিন্দু দিয়ে একটি দুটি এর পরিপূরক সংখ্যা তৈরি করতে সম্মত হয় এবং আপনি ঘোষণা করার পরে ডিবি স্কিমায় সঞ্চিত থাকে কলামটি উল্লেখ করুন এবং এটি ডেসিমাল আকার এবং দশমিক পয়েন্ট অবস্থান নির্ধারণ করুন।

উদাহরণস্বরূপ, আপনি যদি 32-বিট ইনট নেন তবে আপনি 0 - 4,294,967,295 থেকে যে কোনও সংখ্যা সঞ্চয় করতে পারবেন। এটি কেবল নির্ভরযোগ্যভাবে 999,999,999 কে কভার করবে, সুতরাং আপনি যদি 2 টি বিট ফেলে দেন এবং ব্যবহার করেন (1 << 30 -1) আপনি কিছুই ছেড়ে দিতে চাইবেন না। 4 টি ASCII অক্ষর বা 8 টি ভঙ্গুর সংখ্যা ব্যবহার করে 32 বিটগুলিতে 4 সংখ্যার আওতায় কেবল 4 বাইটের সাহায্যে সমস্ত 9-সংখ্যার সংখ্যা Coverেকে রাখা আরও দক্ষ efficient (একটি নিবিলিটি 4-বিটস, 0-9 এর জন্য প্রয়োজনীয় 0-15 এর চেয়ে বেশি মানগুলিকে মঞ্জুরি দেয় তবে আপনি 3 টি বিটে গিয়ে এই বর্জ্যটি অপসারণ করতে পারবেন না কারণ এটি কেবল 0-7 মানগুলিকেই অন্তর্ভুক্ত করে)

মাইএসকিউএল অনলাইন ডক্সে ব্যবহৃত উদাহরণটি ডেসিমাল (18,9) উদাহরণ হিসাবে ব্যবহার করে। এটি 9 সংখ্যার আগে এবং সূচিত দশমিক বিন্দুর পিছনে 9 ডিজিট, যা উপরে বর্ণিত হিসাবে নিম্নলিখিত স্টোরেজটির প্রয়োজন requires

18 8-বিট চর হিসাবে: 144 বিট

18 4-বিট nybbles হিসাবে: 72 বিট

2 32-বিট পূর্ণসংখ্যার হিসাবে: 64 বিট

বর্তমানে ডেসিমাল সর্বাধিক 65 ডিজিটকে সমর্থন করে, যেমন ডিসিআইএমএল (এম, ডি) যেখানে এম এর জন্য সর্বাধিক মান 65 হয় এবং ডি এর অনুমোদিত বৃহত্তম মান 30 হয়।

একসাথে 9 ডিজিটের অংশগুলির প্রয়োজন না হওয়ার জন্য, 32-বিটের চেয়ে ছোট পূর্ণসংখ্যাগুলি 1,2 এবং 3 বাইট পূর্ণসংখ্যা ব্যবহার করে অঙ্কগুলি যুক্ত করতে ব্যবহৃত হয়। কিছু কারণে যে যুক্তিটিকে অস্বীকার করে, স্বাক্ষর না করে পরিবর্তে স্বাক্ষরযুক্ত ইনট ব্যবহার করা হত এবং এর ফলে 1 বিট ফেলে দেওয়া হয় যার ফলে নিম্নলিখিত স্টোরেজ সক্ষমতা তৈরি হয়। 1,2 এবং 4 বাইট ইনটগুলির জন্য হারানো বিটটি কিছু যায় আসে না, তবে 3-বাইট ইন্টের জন্য এটি একটি দুর্যোগ কারণ পুরো এক অঙ্কটি সেই এক বিটের ক্ষতির কারণে হারিয়ে যায়।

একটি 7-বিট int সহ: 0 - 99

একটি 15-বিট int সহ: 0 - 9,999

একটি 23-বিট ইন্টি সহ: 0 - 999,999 (24 - বিট ইনট সহ 0 - 9,999,999)

1,2,3 এবং 4-বাইট পূর্ণসংখ্যাগুলি একত্রে একটি "বিট পুল" গঠনের জন্য সংশ্লেষিত হয় DECIMAL দুটি সংখ্যার পরিপূরক পূর্ণসংখ্যার হিসাবে সংখ্যার যথাযথভাবে প্রতিনিধিত্ব করতে ব্যবহার করে। দশমিক বিন্দু সংরক্ষণ করা হয় না, এটি নিহিত হয়।

এর অর্থ সিপিইউ একটি সংখ্যা হিসাবে স্বীকৃত কিছুতে "নম্বর" রুপান্তর করার জন্য ডিবি ইঞ্জিনের কোনও রূপান্তর রূপান্তর করতে কোনও এএসসিআইআই প্রয়োজন হয় না। কোনও গোলাকার নয়, কোনও রূপান্তর ত্রুটি নেই, এটি সিপিইউ হেরফের করতে পারে এমন একটি আসল সংখ্যা।

এই ইচ্ছামত বৃহত্তর পূর্ণসংখ্যার গণনা অবশ্যই সফ্টওয়্যারেই করা উচিত, কারণ এই ধরণের সংখ্যার জন্য কোনও হার্ডওয়্যার সমর্থন নেই, তবে এই লাইব্রেরিগুলি অনেক পুরানো এবং উচ্চতর অনুকূলিত হয়েছে, 50 বছর আগে আইবিএম 370 ফোর্টরান স্বেচ্ছাচারিত নির্ভুলতা ভাসমান পয়েন্ট ডেটা সমর্থন করার জন্য লেখা হয়েছিল । তারা সিপিইউ ইন্টিজার হার্ডওয়্যারের সাথে সম্পন্ন স্থির আকারের পূর্ণসংখ্যার বীজগণিতের তুলনায় বা এফপিইউতে ভাসমান পয়েন্ট গণনার তুলনায় এখনও অনেক ধীর।

স্টোরেজ দক্ষতার ক্ষেত্রে, যেহেতু একটি ফ্লোটের সূচক প্রতিটি ফ্লোটের সাথে সংযুক্ত থাকে, স্পষ্টভাবে নির্দিষ্ট করে যে দশমিক বিন্দুটি রয়েছে তা স্পষ্টভাবে উল্লেখ করে, এটি ব্যাপকভাবে অপ্রয়োজনীয়, এবং তাই ডিবি কাজের জন্য অদক্ষ। একটি ডিবিতে আপনি ইতিমধ্যে জানেন যে দশমিক পয়েন্টটি সামনে যেতে হবে এবং ডেসিমাল কলামের মান রয়েছে এমন সারণীতে যে সারি রয়েছে তার দশমিক পয়েন্টটি কোথায় রাখা হবে, সংরক্ষণ করা হবে তার কেবল 1 এবং কেবলমাত্র বিশদটি দেখতে হবে a স্কাইমাতে একটি ডেসিমাল (এম, ডি) এর পক্ষে যুক্তি হিসাবে এম এবং ডি মানগুলিকে বোঝায়।

বিভিন্ন ধরণের অ্যাপ্লিকেশনগুলির জন্য কোন ফর্ম্যাটটি ব্যবহার করতে হবে সে সম্পর্কে এখানে প্রচুর মন্তব্য পাওয়া গেছে, সুতরাং আমি বিন্দুটি বেলবো না। আমি এখানে এটি লেখার জন্য সময় নিলাম কারণ যে কেউ লিঙ্কযুক্ত মাইএসকিউএল অনলাইন ডকুমেন্টেশন বজায় রাখছেন তিনি উপরের কোনওটি বুঝতে পারেন না এবং ক্রমবর্ধমান হতাশাবোধের চক্রের পরেও তাদের কাছে এটি ব্যাখ্যা করার চেষ্টা করেছি আমি ছেড়ে দিয়েছি। তারা কী লিখছেন তা কতটা দুর্বল তা বোঝার একটি ভাল ইঙ্গিতটি হ'ল বিষয়টির খুব ঘোলাটে এবং প্রায় অনির্বচনীয় উপস্থাপনা।

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


আমি বিশ্বাস করি যে ইন্টেলের হ্যাজওল আর্কিটেকচার হিসাবে 256 বিট ইন্টিজারে অ্যাভিএক্স -2 অপারেশন রয়েছে, যা প্রতিটি সম্ভাব্য মান 77 সংখ্যাকে উপস্থাপন করতে পারে, যেটি ডেসিমালের বর্ধিত নির্ভুলতা পূর্ণসংখ্যায় সরাসরি পরিচালনা করতে ব্যবহার করা যেতে পারে। ভবিষ্যতে digit 77 ডিজিটের বিপরীতে s covering ডিজিটের আওতায় অরাকল একটি নতুন রূপের সমর্থন করার পক্ষে বুদ্ধিমানের প্রমাণ হতে পারে I আমি সফটওয়্যারের পরিবর্তে হার্ডওয়্যার ব্যবহার করে 5-10X পারফরম্যান্স উন্নতি অনুমান করব। 2 ^ 256 = 115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129, 639,936 (78 ডিজিট)

ইন্টেলের ভেক্টর প্রসেসরগুলি এখন 512 বিট গাণিতিক ক্রিয়াকলাপ সমর্থন করে। এটি 154 সংখ্যার আওতায় আসবে। 2 ^ 512 = 13.407.807.929.942.597.099.574.024.998.205.846.127.479.365.820.592.393.377.723.561.443.721.764.030.073.546.976.801.874.298.166.903.427.690.031.858.186.486.050.853.753.882.811.946.569.946.433.649.006.084.096 (155 সংখ্যার)

13

কেবল মাইএসকিউএল-এর সাথে সুনির্দিষ্ট নয়, ভাসা এবং দশমিক প্রকারের মধ্যে পার্থক্য হ'ল তারা ভগ্নাংশের মানগুলি উপস্থাপন করে। ভাসমান পয়েন্টের প্রকারগুলি বাইনারিতে ভগ্নাংশকে উপস্থাপন করে যা কেবল মান হিসাবে উপস্থাপন করতে পারে {m*2^n | m, n Integers}। 1/5 এর মতো মানগুলি যথাযথভাবে উপস্থাপন করা যায় না (রাউন্ড অফ ত্রুটি ব্যতীত)। দশমিক সংখ্যা একইভাবে সীমাবদ্ধ, তবে সংখ্যার মতো প্রতিনিধিত্ব করে {m*10^n | m, n Integers}। দশমিকগুলি এখনও 1/3 এর মতো সংখ্যার প্রতিনিধিত্ব করতে পারে না, তবে প্রায়শই এটি অনেকগুলি সাধারণ ক্ষেত্রে যেমন ফিনান্সের ক্ষেত্রে ঘটে থাকে that যেহেতু দশমিক সংখ্যা $0.20(ডলারের এক পঞ্চম) মতো মানের প্রতিনিধিত্ব করতে পারে , তাই এই পরিস্থিতিতে এটি পছন্দ করা হয়।


যেহেতু ইন্টেল প্রসেসরগুলি সমস্ত বিস্ময়কর ডাবল ফ্লোট অপারেশনগুলি 80 বিট যথার্থতার সাথে করে, চূড়ান্ত ফলাফলটি 80 বিট থেকে 64 বিটের মধ্যে ছাঁটাই করা হয় তখন প্রায় ব্যতিক্রম ছাড়া গোলাকার ত্রুটি হয় না। এমনকি অনেকগুলি ফ্লোটিং পয়েন্ট সফ্টওয়্যার লাইব্রেরি এগুলি এবং শত শত অন্যান্য গাণিতিক ব্যতিক্রমগুলি পরিচালনা করতে পারে। তত্ত্ব এবং অনুশীলন এইভাবে বন্যভাবে এই অঞ্চলে বিচ্যুত হয়।

9

দশমিক হ'ল অর্থের মতো স্থির পরিমাণের জন্য যেখানে আপনি নির্দিষ্ট দশমিক দশক স্থান চান। ফ্লোটগুলি স্টোর করার জন্য ... ভাসমান পয়েন্ট যথার্থ নম্বরগুলি।


6

আমি এটি দরকারী খুঁজে পেয়েছি:

সাধারণত, ভাসমান মানগুলি বৈজ্ঞানিক গণনার জন্য ভাল তবে আর্থিক / আর্থিক মূল্যবোধের জন্য ব্যবহার করা উচিত নয়। বিজনেস ওরিয়েন্টেড ম্যাথের জন্য সর্বদা দশমিক ব্যবহার করুন।

সূত্র: http://code.rohitink.com/2013/06/12/mysql-integer-float-decimal-data-types-differences/


5
mysql> CREATE TABLE num(id int ,fl float,dc dec(5,2));
Query OK, 0 rows affected (0.00 sec)


mysql> INSERT INTO num VALUES(1,13.75,13.75);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO num VALUES(2,13.15,13.15);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM num WHERE fl = 13.15;
Empty set (0.00 sec)

mysql> SELECT * FROM num WHERE dc = 13.15;
+------+-------+-------+
| id   | fl    | dc    |
+------+-------+-------+
|    2 | 13.15 | 13.15 |
+------+-------+-------+
1 row in set (0.00 sec)

mysql> SELECT SUM(fl) ,SUM(dc)  FROM num;
+--------------------+---------+
| SUM(fl)            | SUM(dc) |
+--------------------+---------+
| 26.899999618530273 |   26.90 |
+--------------------+---------+
1 row in set (0.00 sec)


mysql> SELECT * FROM num WHERE ABS(fl -  13.15)<0.01;
+------+-------+-------+
| id   | fl    | dc    |
+------+-------+-------+
|    2 | 13.15 | 13.15 |
+------+-------+-------+
1 row in set (0.00 sec)

2

আপনি যদি পারফরম্যান্সের পরে থাকেন এবং যথার্থ না হয়ে থাকেন তবে আপনার অবশ্যই খেয়াল করা উচিত যে ফ্লোটের সাথে গণনা দশমিকের চেয়ে অনেক দ্রুত are


2

ভাসমান-পয়েন্টের প্রকারগুলি (আনুমানিক মান) - ফ্লাট, ডাবল

ফ্লোট এবং ডাবল প্রকারগুলি আনুমানিক সংখ্যার ডেটা মানগুলিকে উপস্থাপন করে। মাইএসকিউএল একক নির্ভুলতার মানগুলির জন্য চারটি বাইট এবং ডাবল-যথার্থ মানের জন্য আট বাইট ব্যবহার করে।

ফ্লাটের জন্য, এসকিউএল স্ট্যান্ডার্ড প্যারেন্টেসিসগুলিতে ফ্লোটের মূলশব্দটি অনুসরণ করে বিটগুলিতে যথাযথতার butচ্ছিক স্পেসিফিকেশন (তবে ঘোরের সীমা নয়) এর অনুমতি দেয়। মাইএসকিউএল এই alচ্ছিক নির্ভুলতা স্পেসিফিকেশন সমর্থন করে, কিন্তু যথার্থ মান শুধুমাত্র স্টোরেজ আকার নির্ধারণ করতে ব্যবহৃত হয়। 0 থেকে 23 এর মধ্যে একটি নির্ভুলতা 4-বাইট একক-নির্ভুলতা ফ্লোট কলামে ফল দেয়। 24 থেকে 53 এর মধ্যে একটি স্পষ্টতা 8-বাইট ডাবল-স্পষ্টতা ডাবল কলামে ফলাফল।

মাইএসকিউএল একটি নন-স্ট্যান্ডার্ড সিনট্যাক্সের অনুমতি দেয়: ফ্লাট (এম, ডি) বা রিয়েল (এম, ডি) বা ডাবল প্রিসিশন (এম, ডি)। এখানে, "(এম, ডি)" এর অর্থ মানগুলি মোট এম সংখ্যা পর্যন্ত সংরক্ষণ করতে পারে, যার মধ্যে ডি ডিজিট দশমিক বিন্দুর পরে হতে পারে। উদাহরণস্বরূপ, ফ্লোয়েট হিসাবে সংজ্ঞায়িত একটি কলাম (7,4) প্রদর্শিত হলে -999.9999 এর মতো দেখাবে। মাইএসকিউএল মানগুলি সংরক্ষণের সময় রাউন্ডিং সম্পাদন করে, সুতরাং আপনি যদি 999.00009 ফ্লাট (7,4) কলামে sertোকান তবে আনুমানিক ফলাফল 999.0001 হয়।

যেহেতু ভাসমান-পয়েন্টের মানগুলি আনুমানিক এবং যথাযথ মান হিসাবে সংরক্ষণ করা হয় না, সেগুলি তুলনার ক্ষেত্রে যথাযথ হিসাবে বিবেচনা করার প্রচেষ্টা সমস্যার কারণ হতে পারে। তারা প্ল্যাটফর্ম বা বাস্তবায়ন নির্ভরতা সাপেক্ষে।

সর্বাধিক বহনযোগ্যতার জন্য, আনুমানিক সংখ্যার ডেটা মানগুলির স্টোরেজের প্রয়োজনীয় কোডটির যথাযথতা বা সংখ্যার কোনও স্পেসিফিকেশন ছাড়াই ফ্লোট বা ডাবল প্রীতি ব্যবহার করা উচিত।

https://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html

ভাসমান-পয়েন্ট মান সহ সমস্যা

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

ভাসমান-পয়েন্ট অপারেশন ব্যবহার করে গণনাগুলি কীভাবে ভাসমান-পয়েন্ট ত্রুটির সাপেক্ষে তা নিরূপণের জন্য নিম্নলিখিত উদাহরণটি ডাবল ব্যবহার করে।

mysql> CREATE TABLE t1 (i INT, d1 DOUBLE, d2 DOUBLE);
mysql> INSERT INTO t1 VALUES (1, 101.40, 21.40), (1, -80.00, 0.00),
    -> (2, 0.00, 0.00), (2, -13.20, 0.00), (2, 59.60, 46.40),
    -> (2, 30.40, 30.40), (3, 37.00, 7.40), (3, -29.60, 0.00),
    -> (4, 60.00, 15.40), (4, -10.60, 0.00), (4, -34.00, 0.00),
    -> (5, 33.00, 0.00), (5, -25.80, 0.00), (5, 0.00, 7.20),
    -> (6, 0.00, 0.00), (6, -51.40, 0.00);

mysql> SELECT i, SUM(d1) AS a, SUM(d2) AS b
    -> FROM t1 GROUP BY i HAVING a <> b;

+------+-------+------+
| i    | a     | b    |
+------+-------+------+
|    1 |  21.4 | 21.4 |
|    2 |  76.8 | 76.8 |
|    3 |   7.4 |  7.4 |
|    4 |  15.4 | 15.4 |
|    5 |   7.2 |  7.2 |
|    6 | -51.4 |    0 |
+------+-------+------+

ফলাফলটি সঠিক। যদিও প্রথম পাঁচটি রেকর্ড দেখে মনে হচ্ছে তাদের তুলনাটি সন্তুষ্ট করা উচিত নয় (a এবং b এর মানগুলি পৃথক বলে মনে হয় না) তবে তারা এটি করতে পারে কারণ কারণগুলির উপর নির্ভর করে সংখ্যার মধ্যে পার্থক্য দশম দশমিক বা তার বেশি দেখা যায় যেমন কম্পিউটার আর্কিটেকচার বা সংকলক সংস্করণ বা অপ্টিমাইজেশন স্তর। উদাহরণস্বরূপ, বিভিন্ন সিপিইউ ভাসমান-পয়েন্ট সংখ্যাগুলি আলাদাভাবে মূল্যায়ন করতে পারে।

যদি D1 এবং d2 কলামগুলি ডুবলের পরিবর্তে DECIMAL হিসাবে সংজ্ঞায়িত করা হয়, তবে নির্বাচিত ক্যোয়ারির ফলাফলটিতে কেবল একটি সারি থাকবে have উপরের দেখানো সর্বশেষটি।

ভাসমান-পয়েন্ট সংখ্যা তুলনা করার সঠিক উপায়টি হ'ল প্রথমে সংখ্যার মধ্যে পার্থক্যের জন্য একটি গ্রহণযোগ্য সহনশীলতার বিষয়ে সিদ্ধান্ত নেওয়া এবং তারপরে সহনশীলতার মানের তুলনায় তুলনা করা। উদাহরণস্বরূপ, যদি আমরা সম্মত হই যে দশ হাজারের মধ্যে (0.0001) একের যথার্থতার মধ্যে যদি ভাসমান-পয়েন্ট সংখ্যাগুলি একই হয় তবে তা সহনশীলতার মানের চেয়ে বড় পার্থক্য খুঁজতে তুলনাটি লিখতে হবে:

mysql> SELECT i, SUM(d1) AS a, SUM(d2) AS b FROM t1
    -> GROUP BY i HAVING ABS(a - b) > 0.0001;
+------+-------+------+
| i    | a     | b    |
+------+-------+------+
|    6 | -51.4 |    0 |
+------+-------+------+
1 row in set (0.00 sec)

বিপরীতভাবে, সারিগুলি পেতে যেখানে সংখ্যাগুলি একই হয়, পরীক্ষার সহনশীলতার মানের মধ্যে পার্থক্য খুঁজে পাওয়া উচিত:

mysql> SELECT i, SUM(d1) AS a, SUM(d2) AS b FROM t1
    -> GROUP BY i HAVING ABS(a - b) <= 0.0001;
+------+------+------+
| i    | a    | b    |
+------+------+------+
|    1 | 21.4 | 21.4 |
|    2 | 76.8 | 76.8 |
|    3 |  7.4 |  7.4 |
|    4 | 15.4 | 15.4 |
|    5 |  7.2 |  7.2 |
+------+------+------+
5 rows in set (0.03 sec)

ভাসমান-পয়েন্ট মানগুলি প্ল্যাটফর্ম বা বাস্তবায়ন নির্ভরতার সাপেক্ষে। মনে করুন যে আপনি নিম্নলিখিত বিবৃতিগুলি কার্যকর করেছেন:

CREATE TABLE t1(c1 FLOAT(53,0), c2 FLOAT(53,0));
INSERT INTO t1 VALUES('1e+52','-1e+52');
SELECT * FROM t1;

কিছু প্ল্যাটফর্মে, নির্বাচনী বিবৃতিটি ইনফ এবং ইনফ করে দেয়। অন্যদের উপর, এটি 0 এবং -0 প্রদান করে।

পূর্ববর্তী ইস্যুগুলির একটি নিদর্শনটি হ'ল আপনি যদি মাস্টারের উপরে মাইএসকিल्डম্পের সাথে টেবিলের বিষয়বস্তুগুলি ডাম্প করে এবং ডাম্প ফাইলটি স্লেভটিতে পুনরায় লোড করে একটি প্রতিলিপি স্লেভ তৈরি করার চেষ্টা করেন, তবে ভাসমান-পয়েন্ট কলামগুলিযুক্ত টেবিলগুলি দুটি হোস্টের মধ্যে পৃথক হতে পারে।

https://dev.mysql.com/doc/refman/5.5/en/problems-with-float.html


0

হার্ড এবং ফাস্ট বিধি

আপনার যা করা দরকার তা হ'ল আপনি যে সংখ্যাগুলি সংরক্ষণ করছেন তার যোগ, বিয়োগ বা গুণন করা, DECIMAL সেরা।

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

যথার্থতার জন্য, আমি একবার বাজেট সিস্টেম লিখেছিলাম যা 3,000+ অ্যাকাউন্টের প্রত্যেকটির% অবদানকে সেই ইউনিটের একীকরণ নোডে মাসে 6,000 বাজেট ইউনিটের জন্য গণনা করে, তারপরে শতাংশের (3,000 + x 12 x 3,600) উপর ভিত্তি করে আমি সাংগঠনিক নোডগুলির পরবর্তী 3 স্তরে সর্বোচ্চ সাংগঠনিক নোডগুলি দ্বারা বাজেটের পরিমাণকে গুণিত করেছিলাম এবং তারপরে সমস্ত 3,200 বিশদ ইউনিটের জন্য সমস্ত (3,000 + 12) মান গণনা করি। মিলিয়ন-মিলিয়ন এবং মিলিয়ন মিলিয়ন ডাবল নির্ভুলতা ভাসমান পয়েন্ট গণনা, যার মধ্যে যে কোনও একটি বোতল-আপ একীকরণের মধ্যে pro সমস্ত অনুমানের রোল-আপকে সংগঠনের সর্বোচ্চ স্তরে ফিরিয়ে দেবে।

এই সমস্ত গণনার পরে মোট ভাসমান পয়েন্ট ত্রুটি ছিল শূন্য । এটি 1986 সালে ছিল, এবং ভাসমান পয়েন্ট লাইব্রেরিগুলি আজকের তুলনায় আগের চেয়ে অনেক উন্নত। ইন্টেল এটির মধ্যবর্তী গণনাগুলিকে ৮০ বিট যথার্থে ডাবলগুলি করে, যা গোলাকার ত্রুটিটি বাদ দেয়। যখন কেউ আপনাকে "এটি ভাসমান পয়েন্ট ত্রুটি" বলে দেয় এটি প্রায় নিশ্চিতভাবেই সত্য নয়।


-2

float(এবং double) বাইনারি ভগ্নাংশ উপস্থাপন করে

decimal দশমিক ভগ্নাংশ উপস্থাপন করে


-2
declare @float as float(10)
declare @Decimal as decimal(10)
declare @Inetger as int

set @float =10.7
set @Decimal =10.7
set @Inetger=@Decimal

print @Inetger

পূর্ণসংখ্যার প্রিন্ট 10 এ মান দশমিক 11 এ সেট করলে ভাসমানের মধ্যে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.