পাইথনে নেতিবাচক সংখ্যার উপর মডুলো অপারেশন


94

নেতিবাচক সংখ্যার বিষয়ে পাইথনে আমি কিছু অদ্ভুত আচরণ পেয়েছি:

>>> -5 % 4
3

কি ঘটছে তা কেউ ব্যাখ্যা করতে পারেন?


25
আমার কাছে ডান দেখাচ্ছে
Wheaties



8
আপনি math.fmodসি বা জাভা হিসাবে একই আচরণ পেতে ব্যবহার করতে পারেন ।
0x2b3bfa0

উত্তর:


137

সি বা সি ++ এর বিপরীতে পাইথনের মডুলো অপারেটর ( %) সর্বদা ডিনামিনেটর (বিভাজক) এর সমান চিহ্নযুক্ত একটি নম্বর প্রদান করে। আপনার অভিব্যক্তি 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 দেখুন ))


6
আশ্চর্যের বিষয় হল, পাইথনের মডুলো অপারেটর (%) সর্বদা ডিনোমিনেটর (বিভাজক) এর মতো চিহ্ন সহ একটি নম্বর দেয় না । দেখুন stackoverflow.com/questions/48347515/...
zezollo

33

এখানে গুডো ভ্যান রসমের একটি ব্যাখ্যা রয়েছে:

http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html

মূলত, এটি তাই যাতে বাকী r এর সাথে a / b = q এর সাথে সম্পর্কগুলি B * q + r = a এবং 0 <= r <b সংরক্ষণ করে।


4
সি ++ এবং জাভা এর মতো ভাষাও প্রথম সম্পর্ক সংরক্ষণ করে তবে এগুলি নেতিবাচক a, ধনাত্মক b, যেখানে পাইথন মেঝেতে সিল রয়েছে। এটি সর্বদা সত্য abs(r) < b, এবং তারা যদি বন্ধ করে দেয় r <= 0
এভেজেনি সার্জিভ

9

Negativeণাত্মক সংখ্যা সহ পূর্ণসংখ্যা বিভাগ এবং মোডগুলি পরিচালনা করার জন্য সর্বোত্তম উপায় নেই। এটি a/bএকই আকার এবং বিপরীত চিহ্ন একই ছিল যদি দুর্দান্ত হবে (-a)/b। এটি a % bসত্যিই যদি একটি মডুলো খ হত ভাল হবে । যেহেতু আমরা সত্যই চাই a == (a/b)*b + a%b, প্রথম দুটি অসম্পূর্ণ।

কোনটি রাখা একটি কঠিন প্রশ্ন এবং উভয় পক্ষের পক্ষে তর্ক রয়েছে। সি এবং সি ++ বৃত্তাকার পূর্ণসংখ্যা বিভাগ শূন্যের দিকে (তাই a/b == -((-a)/b)), এবং দৃশ্যত পাইথন হয় না।


4
"এটি খুব ভাল হবে যদি একটি / বি একই পরিমাণ এবং (-a) / বি এর বিপরীত চিহ্ন ছিল" " কেন ভাল লাগবে? কখন এটি একটি কাঙ্ক্ষিত আচরণ?
ব্যবহারকারী 76284

কারণ এটি তখন নিয়মিত বিভাগ এবং গুণনের মতোই কাজ করবে এবং এর সাথে কাজ করা স্বজ্ঞাতভাবে সহজ। এটি গাণিতিকভাবে যদিও বোধগম্য নয়।
ডেমিস

6

হিসাবে উল্লেখ করা হয়েছে, পাইথন মডুলো অন্যান্য ভাষার সম্মেলনের ক্ষেত্রে যথাযথভাবে ব্যতিক্রম করে 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


ধন্যবাদ আপনার উদাহরণ আমাকে এটি বুঝতে বাধ্য করেছে :)
লামিস

5

ইন পাইথন , ফরম অপারেটরের এই মত কাজ করে।

>>> 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 সম্পর্কে আরও তথ্যের প্রয়োজন হয়, তাহলে পড়তে এই


3

মডুলো, সমমানের ক্লাস 4:

  • 0: 0, 4, 8, 12 ... এবং -4, -8, -12 ...
  • 1: 1, 5, 9, 13 ... এবং -3, -7, -11 ...
  • 2: 2, 6, 10 ... এবং -2, -6, -10 ...
  • 3: 3, 7, 11 ... এবং -1, -5, -9 ...

নেতিবাচক সংখ্যার সাথে মডুলোর আচরণের একটি লিঙ্ক এখানে । (হ্যাঁ, আমি এটি googled)


@ নাল ইউজারএক্সসেপশন - হ্যাঁ, এটি ছিল। স্থির ধন্যবাদ
Wheaties

1

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


1

এটি উল্লেখ করার মতো বিষয়ও রয়েছে যে পাইথনের বিভাগটিও সি থেকে আলাদা: বিবেচনা করুন

>>> 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 এর যে কোনও চিহ্ন সংমিশ্রনের জন্য কাজ করছে এটি শর্তাধীন বিবৃতি এড়িয়ে চলে।

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