নেতিবাচক সংখ্যার বিষয়ে পাইথনে আমি কিছু অদ্ভুত আচরণ পেয়েছি:
>>> -5 % 4
3
কি ঘটছে তা কেউ ব্যাখ্যা করতে পারেন?
নেতিবাচক সংখ্যার বিষয়ে পাইথনে আমি কিছু অদ্ভুত আচরণ পেয়েছি:
>>> -5 % 4
3
কি ঘটছে তা কেউ ব্যাখ্যা করতে পারেন?
..., -9, -5, -1, 3, 7, ...
math.fmod
সি বা জাভা হিসাবে একই আচরণ পেতে ব্যবহার করতে পারেন ।
উত্তর:
সি বা সি ++ এর বিপরীতে পাইথনের মডুলো অপারেটর ( %
) সর্বদা ডিনামিনেটর (বিভাজক) এর সমান চিহ্নযুক্ত একটি নম্বর প্রদান করে। আপনার অভিব্যক্তি 3 দেয় কারণ
(-5) / 4 = -1.25 -> তল (-1.25) = -2
(-5)% 4 = (-2 × 4 + 3)% 4 = 3।
এটি সি আচরণের উপরে বেছে নেওয়া হয়েছে কারণ একটি নন-নেগেটিভ ফলাফল প্রায়শই বেশি কার্যকর। উদাহরণস্বরূপ সপ্তাহের দিনগুলি গণনা করা। আজ যদি মঙ্গলবার (দিন # 2) হয় তবে সপ্তাহের N দিন আগে কী? পাইথনে আমরা গণনা করতে পারি
return (2 - N) % 7
তবে সি-তে, যদি N ≥ 3 হয় তবে আমরা একটি নেতিবাচক সংখ্যা পাই যা একটি অবৈধ সংখ্যা, এবং আমাদের ম্যানুয়ালি 7 যুক্ত করে এটি ঠিক করতে হবে:
int result = (2 - N) % 7;
return result < 0 ? result + 7 : result;
( ফলাফলের সাইন কীভাবে বিভিন্ন ভাষার জন্য নির্ধারিত হয় তার জন্য http://en.wikedia.org/wiki/Modulo_operator দেখুন ))
এখানে গুডো ভ্যান রসমের একটি ব্যাখ্যা রয়েছে:
http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html
মূলত, এটি তাই যাতে বাকী r এর সাথে a / b = q এর সাথে সম্পর্কগুলি B * q + r = a এবং 0 <= r <b সংরক্ষণ করে।
a
, ধনাত্মক b
, যেখানে পাইথন মেঝেতে সিল রয়েছে। এটি সর্বদা সত্য abs(r) < b
, এবং তারা যদি বন্ধ করে দেয় r <= 0
।
Negativeণাত্মক সংখ্যা সহ পূর্ণসংখ্যা বিভাগ এবং মোডগুলি পরিচালনা করার জন্য সর্বোত্তম উপায় নেই। এটি a/b
একই আকার এবং বিপরীত চিহ্ন একই ছিল যদি দুর্দান্ত হবে (-a)/b
। এটি a % b
সত্যিই যদি একটি মডুলো খ হত ভাল হবে । যেহেতু আমরা সত্যই চাই a == (a/b)*b + a%b
, প্রথম দুটি অসম্পূর্ণ।
কোনটি রাখা একটি কঠিন প্রশ্ন এবং উভয় পক্ষের পক্ষে তর্ক রয়েছে। সি এবং সি ++ বৃত্তাকার পূর্ণসংখ্যা বিভাগ শূন্যের দিকে (তাই a/b == -((-a)/b)
), এবং দৃশ্যত পাইথন হয় না।
হিসাবে উল্লেখ করা হয়েছে, পাইথন মডুলো অন্যান্য ভাষার সম্মেলনের ক্ষেত্রে যথাযথভাবে ব্যতিক্রম করে makes
এটি নেতিবাচক সংখ্যাকে একটি বিরামবিহীন আচরণ দেয়, বিশেষত যখন //
পূর্ণসংখ্যার-বিভাজন অপারেটরের সাথে সংমিশ্রণে ব্যবহৃত হয় , কারণ মডিউলগুলি%
প্রায়শই (গণিতের মতো। ডিভোমডে ) থাকে:
for n in range(-8,8):
print n, n//4, n%4
উত্পাদন:
-8 -2 0
-7 -2 1
-6 -2 2
-5 -2 3
-4 -1 0
-3 -1 1
-2 -1 2
-1 -1 3
0 0 0
1 0 1
2 0 2
3 0 3
4 1 0
5 1 1
6 1 2
7 1 3
%
সর্বদা শূন্য বা ধনাত্মক ফলাফল * দেয়//
সর্বদা নেতিবাচক অসীমের দিকে ঘুরতে থাকে* ... যতক্ষণ না ডান অপারেণ্ড ইতিবাচক থাকে। অন্য দিকে11 % -10 == -9
ইন পাইথন , ফরম অপারেটরের এই মত কাজ করে।
>>> mod = n - math.floor(n/base) * base
সুতরাং ফলাফলটি (আপনার ক্ষেত্রে):
mod = -5 - floor(-1.25) * 4
mod = -5 - (-2*4)
mod = 3
অন্য ভাষা যেমন সি, জাভা, জাভাস্ক্রিপ্ট মেঝে পরিবর্তে কাটা ব্যবহার করে।
>>> mod = n - int(n/base) * base
যার ফলাফল:
mod = -5 - int(-1.25) * 4
mod = -5 - (-1*4)
mod = -1
আপনি পাইথন মধ্যে rounding সম্পর্কে আরও তথ্যের প্রয়োজন হয়, তাহলে পড়তে এই ।
মডুলো, সমমানের ক্লাস 4:
নেতিবাচক সংখ্যার সাথে মডুলোর আচরণের একটি লিঙ্ক এখানে । (হ্যাঁ, আমি এটি googled)
আমি এটি পাইথনের একটি অদ্ভুত আচরণ বলেও ভেবেছিলাম। দেখা যাচ্ছে যে আমি বিভাগটি ভালভাবে সমাধান করছিলাম না (কাগজে); আমি ভাগফলকে 0 এবং একটি বাকী -5 এর মান বাকী দিয়েছিলাম। ভয়াবহ ... আমি পূর্ণসংখ্যার সংখ্যার জ্যামিতিক উপস্থাপনাটি ভুলে গেছি। সংখ্যা রেখার দ্বারা প্রদত্ত পূর্ণসংখ্যার জ্যামিতিকে স্মরণ করে, কেউ ভাগফল এবং বাকী অংশের জন্য সঠিক মান পেতে পারে এবং পাইথনের আচরণটি ঠিক আছে কিনা তা পরীক্ষা করতে পারে। (যদিও আমি ধরে নিলাম যে আপনি ইতিমধ্যে আপনার উদ্বেগকে অনেক আগেই সমাধান করেছেন)।
এটি উল্লেখ করার মতো বিষয়ও রয়েছে যে পাইথনের বিভাগটিও সি থেকে আলাদা: বিবেচনা করুন
>>> x = -10
>>> y = 37
সি আপনি ফলাফল আশা
0
পাইথনে এক্স / ওয়াই কি?
>>> print x/y
-1
এবং% হল মডুলো - বাকিটি নয়! যখন x% y সি ফলন দেয়
-10
অজগর ফলন।
>>> print x%y
27
আপনি উভয় সি হিসাবে পেতে পারেন
বিভাগ:
>>> from math import trunc
>>> d = trunc(float(x)/y)
>>> print d
0
এবং অবশিষ্ট (উপরে থেকে বিভাগ ব্যবহার করে):
>>> r = x - d*y
>>> print r
-10
এই গণনাটি সম্ভবত দ্রুত নয় তবে এটি সি এবং প্লাসের মতো একই ফলাফল অর্জনের জন্য x এবং y এর যে কোনও চিহ্ন সংমিশ্রনের জন্য কাজ করছে এটি শর্তাধীন বিবৃতি এড়িয়ে চলে।