পাইথনের গণিত.সিল () এবং গণিত.ফ্লুর () অপারেশনগুলি কেন পূর্ণসংখ্যার পরিবর্তে ভাসমান?


170

কেউ এটিকে ব্যাখ্যা করতে পারেন ( ডক্স থেকে সরাসরি - জোর আমার):

math.ceil (x) এর রিটার্ন x এর সিলিং একটি float হিসাবে , ক্ষুদ্রতম পূর্ণসংখ্যা চেয়ে মান বড় বা এক্স এর সমান।

math.floor (x) এর রিটার্ন এক্স মেঝেতে একটি float হিসাবে , বৃহত্তম পূর্ণসংখ্যা মান কম বা এক্স এর সমান।

পূর্ণসংখ্যা গণনা করার সংজ্ঞা অনুসারে কেন তারা ভাসমান .ceilএবং .floorফিরে আসবে ?


সম্পাদনা করুন:

আচ্ছা এই কেন তারা হিসাবে কিছু খুব ভাল যুক্তি রয়েছে উচিত ভাসে আসতে, এবং আমি শুধু ধারণা ব্যবহার করা হচ্ছে যখন @jcollado নির্দিষ্ট তারা আসলে যে কি করতে পাইথন 3 আগমন আছে ints ...


1
আমার অনুমানটি হ'ল এটি কারণ যে এক্স একটি ফ্লোট, কোনও পূর্ণসংখ্যার নয়, তবে যেহেতু আমি পাইথন জানি না বা ব্যবহার করি না, তাই আমি অন্য কাউকে আরও নির্দিষ্ট করে উত্তর দিতে দেব। :)
অ্যাডাম ভি

6
@ অ্যাডাম- তবে সিল / ফ্লোর ক্রিয়াকলাপের পুরো পয়েন্টটি পূর্ণসংখ্যার পক্ষে গোলাকার ভাসমান!
ইয়ারিন

1
এটি প্রথমবারের মতো আসার পরেও আমাকে বিরক্ত করেছিল, কারণ এটি কেবল ভুল বলে মনে হচ্ছে। কমপক্ষে, এটি ব্যবহার করা খুব কঠিন নয় int(floor(n))
wim

1
হাস্যকরভাবে (যেমন ফ্লোটগুলি ওভারফ্লো প্রতিরোধে ব্যবহৃত হত), তল / সিল দিয়ে ফেরত দেওয়া মান ভাসমান উপস্থাপনের কারণে কম অঙ্কে অর্থহীন, ভাল কোনও 64 বিট ইন্টিফ্রো হওয়ার আগেই। [32 বিটের পুরানো দিনগুলিতে এটি সত্য ছিল না]]
ইয়ভেস দাউস্ট

উত্তর:


99

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

বিবেচনা করুন: যদি floor()কোনও পূর্ণসংখ্যা ফেরত দেওয়া হয় তবে কী floor(1.0e30)ফিরতে হবে?

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


13
যদিও পাইথন পূর্ণসংখ্যাগুলি এখন স্বেচ্ছাচারিতভাবে যথাযথ হয়ে উঠছে, এখনও এমন ভাসমান রয়েছে যার মেঝে এবং সিলিংটি পূর্ণসংখ্যার দ্বারা প্রতিনিধিত্ব করা যায় না। চেষ্টা করুন floor(float("inf"))বা ceil(float("nan"))
মাইকেল হফম্যান

4
@ মাইকেল- স্পষ্টতই P3 এ আপনি যদি চেষ্টা করে থাকেন তবে আপনি এখন ওভারফ্লো এক্সেক্সশন পাবেন। দেখুন jcollado এর উত্তর
Yarin

4
তবুও, এটি একটি 'দীর্ঘ' টাইপ (ওরফে 'বিগিন্ট') ফেরত দেওয়া উচিত, তাই না? আমার কাছে সুস্পষ্ট উত্তরের মতো মনে হচ্ছে তবে এখন আমার মনে হচ্ছে আমি কোনওভাবেই নিরীহ হয়ে যাচ্ছি।
koschei

3
@ কোসচি: এটি পাইথন ৩.x এ রয়েছে, জ্যাকোল্যাডোর উত্তর দেখুন।
গ্রেগ হিউগিল

সীমার মধ্যে থাকা সংখ্যার জন্য এমনকি কেন এটি বোধ করা যায় তা অন্য উত্তরে একটি মন্তব্য দেখুন ।
ivan_pozdeev

96

অন্যান্য উত্তরের দ্বারা নির্দেশিত হিসাবে, অজগরটিতে তারা সম্ভবত প্রবাহিত সমস্যাগুলি রোধ করার historicalতিহাসিক কারণগুলির কারণে ভাসমান ফিরে আসে। যাইহোক, তারা পাইথন 3 এ পূর্ণসংখ্যা ফেরত দেয়।

>>> import math
>>> type(math.floor(3.1))
<class 'int'>
>>> type(math.ceil(3.1))
<class 'int'>

আপনি পিইপি 3141 এ আরও তথ্য পেতে পারেন ।


@ jcollado- আপনি কোথায় দেখতে পাচ্ছেন যে তারা পি 3-তে পূর্ণসংখ্যায় ফিরে আসে?
ইয়ারিন

4
@ ইয়্যারিন আমি ঠিক উপরের কমান্ডগুলি টাইপ করেছি। এছাড়াও আপনি দিয়ে চেষ্টা float("inf")করুন অথবা float("nan"), আপনি একটি পাবেন OverflowErrorব্যতিক্রম।
jcollado

10
সম্পূর্ণতার জন্য, পাইথন numpy.floorএবং ceilরিটার্ন ফ্লোट्स (<ক্লাস 'numpy.float64'>)
নীল জি

1
@ জ্যাকোল্যাডো: float("inf")পাইথন ২.7 বা 3
এন্ডোলিথ

1
@endolith আপনি ঠিক বলেছেন, আমি এটি পরীক্ষা করেছি এবং এটি আর ঘটে না। সম্ভবত এটি এমন কিছু যা ডিসেম্বর ২০১১ সাল থেকে পরিবর্তিত হয়েছে
jcollado

18

আপনার বিভ্রান্তির উত্সটি আপনার মন্তব্যে স্পষ্ট:

সিল / ফ্লোর অপারেশনগুলির পুরো পয়েন্টটি ফ্লোটকে পূর্ণসংখ্যায় রূপান্তর করা হয়!

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

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

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


স্টিফেন- আমি আমার মন্তব্যটি পুনরায় লিখেছিলাম - আমার অর্থ ছিল গোল, রূপান্তর নয়। তবে এটি আমার বিভ্রান্তির উত্স ছিল না - বরং এটি ছিল যে আমি পরিসরের বৈষম্যকে স্বীকৃতি দিচ্ছিলাম না।
ইয়ারিন

দুঃখের বিষয়, আমি আজ ভোটের বাইরে। এটি সঠিক উত্তর, উপস্থাপনের কোনও সীমাবদ্ধতার চেয়ে অনেক বেশি।
মার্সিন

13
আমার প্রোগ্রামিংয়ের বছরগুলিতে, আমি কখনও এমন পরিস্থিতির মুখোমুখি হতে পারি না যেখানে আমি চেয়েছিলাম মেঝে / সিলের ফলাফলটি একটি পূর্ণসংখ্যার পরিবর্তে ভাসা হতে পারে। পাইথন 3 পূর্বে পূর্ণসংখ্যা দেয় তা দেখায় যে এটি আসলে আরও কার্যকর জিনিস। আমি "দফার পয়েন্ট ..." দাবিটি কিনছি না; দেখে মনে হচ্ছে আপনি প্রোগ্রামারটি যা চাইতে পারেন তার চেয়ে পয়েন্টটি এটির উপর ভিত্তি করে নির্ধারণ করছেন।
শ্রীভাতসার আর

2
@ শ্রীভত্সআর আমার কয়েকবার এই পরিস্থিতি হয়েছিল (তবে মূলত পাইথন প্রসঙ্গে)। আমার মনে পড়ার সময়গুলি হ'ল ম্যান্ডেলব্রোট সেটগুলির সাথে কাজ করার সময়। কখনও কখনও আপনাকে একটি অবিচ্ছেদ্য মান তৈরি করতে হবে, তবে তারপরেই মানটির সাথে কিছু ভাসমান বিন্দু অপারেশন প্রয়োগ করুন (বলুন, এটি 0.5 দ্বারা স্কেলিং করুন)। তারপরে এটি মেঝেতে প্রথমে কোনও ইনটে রূপান্তর করা এবং তারপরে অবিলম্বে এটিকে আবার ফ্লোটে রূপান্তরিত করার চেয়ে ফ্লোর্ড ফ্লোট রাখা এবং এটিতে একটি ফ্লোটিং পয়েন্ট অপারেশন প্রয়োগ করা আরও বেশি দক্ষ।
blubberdiblub

17

কারণ পাইথনের ম্যাথ লাইব্রেরি হ'ল সি ম্যাথ লাইব্রেরির চারপাশে একটি পাতলা মোড়ক যা ফেরত দেয়।


সি গণিত লাইব্রেরি নির্বিচারে নির্ভুলতা পূর্ণসংখ্যার সমর্থন করে? কারণ এটি অন্যান্য অজগর গণিত ফাংশন ফিরে আসে।
এন্ডোলিথ

5

পাইথন ২.৪ এর আগে কোনও পূর্ণসংখ্যা সংক্ষিপ্ত প্রকৃত সংখ্যাগুলির পুরো পরিসীমা ধরে রাখতে পারে না।

http://docs.python.org/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers


2
এটি এখন "কাটা প্রকৃত সংখ্যাগুলির পুরো পরিসীমা" ধরে রাখতে পারে না, কারণ এটি অবশ্যই একটি অসীম সেট এবং অতএব তার অসীম পরিমাণ স্মৃতি দরকার। এটি কাটা ফ্লোটের পরিসর ধরে রাখতে পারে , যা কেবল ℝ এর একটি ছোট উপসেট ℝ
বাম দিকের বাইরে

6
টুইটারে তুমি জানো আমি কি বলতে চাইছি।
মার্ক রান্সম

4

যেহেতু ভাসমানগুলির পরিসীমা পূর্ণসংখ্যার চেয়ে বেশি - কোনও পূর্ণসংখ্যার ফিরিয়ে দেওয়া উপচে পড়তে পারে


7
পাইথনে পূর্ণসংখ্যার উপচে পড়ছে না; এর পূর্ণসংখ্যাগুলি বড় আকারের হয়ে গেলে বড়সড়গুলিতে রূপান্তর করে। একটি পাইথন ইন্টারপ্রেটার খুলুন এবং "2 ** 500" টাইপ করুন এবং আপনি দেখতে পাবেন যে আপনি এমন একটি বস্তু পেয়েছেন যা আপনি প্রতিটি উপায়ে যেমন আচরণ করতে পারেন আপনি পেতে পারেন।
koschei

@ কোসচি: অসীম প্রতিনিধিত্ব করার চেষ্টা করার সময় এমনকি বড় চিহ্নগুলি উপচে পড়ে।
স্টিফেন ক্যানন

4

এটি একটি খুব আকর্ষণীয় প্রশ্ন! যেহেতু একটি ভাসা ভাসমান (= bits_for_exponent) সংরক্ষণের জন্য কিছু বিট প্রয়োজন 2**(float_size - bits_for_exponent)সর্বদা একটি অবিচ্ছেদ্য মান হতে হবে! অন্য চরম সময়ে একটি নেতিবাচক ঘনিষ্ঠ সহ একটি ভাসা একটি দিতে হবে 1, 0বা -1। এটি পূর্ণসংখ্যার পরিসীমা বনাম ফ্লোট রেঞ্জের মোটকে আলোচনা করে তোলে কারণ যখনই সংখ্যাটি পূর্ণসংখ্যার ধরণের সীমার বাইরে থাকে তখন এই ফাংশনগুলি কেবল আসল নম্বরটি ফিরিয়ে দেয়। পাইথন ফাংশনগুলি ফাংশনটির মোড়ক Cএবং তাই এটি কার্যকারিতাটির একটি ঘাটতি Cযেখানে তাদের কোনও পূর্ণসংখ্যার ফিরে আসা উচিত ছিল এবং সিল / ফ্লোরে কল করার আগে প্রগ্রেমারকে রেঞ্জ / NaN/ Infচেক করতে বাধ্য করা উচিত ।

সুতরাং যুক্তিযুক্ত উত্তরটি কেবলমাত্র এই ফাংশনগুলি কার্যকর হলে তারা পূর্ণসংখ্যার ব্যাপ্তির মধ্যে একটি মান ফেরত দিতে পারে এবং তাই তারা একটি ভাসা ফেরত দেয় এটি একটি ভুল এবং এটি উপলব্ধি করার জন্য আপনি খুব স্মার্ট!


1

অন্য ভাষাগুলিও এগুলি করে বলে সম্ভবত এটি সাধারণত স্বীকৃত আচরণ। (ভাল উত্তর হিসাবে, অন্যান্য উত্তরে দেখানো হয়েছে)


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