Negatif değerler ile Modülü operasyon - garip şey?

oy
15

Eğer ne kadar söyleyebilir misin (-2) % 5? Benim Python yorumlayıcısı göre 3 olduğunu, ancak bunun için akıllıca bir açıklama var mı?

Bazı dillerde sonucu makineye bağlı olabileceğini okumuştum ama olsa emin değilim.

Oluştur 04/09/2008 saat 14:36
kaynak kullanıcı
Diğer dillerde...                            


12 cevaplar

oy
11

Kişisel Python yorumlayıcısı doğrudur. Bir modülü hesaplamasında biri (aptal) yolu çıkarma ya da elde edilen değeri 0 ° C ila kadar modülüne eklemektir (modülü - 1).

örneğin: 13 mod 5 = (13-5) mod 5 = (13 - 10), mod 5 = 3

ya da burada: -2 mod 5 = (± 2 5) mod 5 = 3

Cevap 04/09/2008 saat 14:40
kaynak kullanıcı

oy
0

Eh, -2 5 bölü Bunu çok platform bağımlı olmalı inanmıyorum 3 bir kalanı 0 olur, ama ben tuhaf şeyler gördüm.

Cevap 04/09/2008 saat 14:41
kaynak kullanıcı

oy
0

Gerçekten de 3 de olan modüler aritmetik bir modül sadece bir veri dizgisi içinde bulunan ve 5 ile bölünerek -2 kalan 3'tür.

Cevap 04/09/2008 saat 14:41
kaynak kullanıcı

oy
12

Negatifler üzerindeki modülü işleminin sonucu bağımlı dilini programlama gibi görünüyor ve burada bir listesidir http://en.wikipedia.org/wiki/Modulo_operation

Cevap 04/09/2008 saat 14:41
kaynak kullanıcı

oy
4

Eh,% 0 5 doğru 0, olmalıdır?

bu ters yönde (bu aralığın dışında olduğundan, yani, bu, 5 olamaz) giderek aşağıdaki izin basamaklı çünkü -1% 5 4 olmalıdır.

Ve bu mantık tarafından birlikte aşağıdaki -2 3 olmalıdır.

o nasıl çalışacağını düşünmek kolay yolu ekleyerek veya numara 0 (dahil) ve 5 (hariç) arasında düşene kadar 5 çıkarılarak devam olmasıdır.

Ben bir uygulama görmedim, ama hiç yapmamıştı diyemeyiz - Ben makine bağımlılığı konusunda emin değilim.

Cevap 04/09/2008 saat 14:41
kaynak kullanıcı

oy
16

Bu arada: En programlama dilleri Python katılmıyorum ve sonucu verecekti -2. Modülü yorumlanması bağlı olarak bu doğrudur. Bununla birlikte, en çok üzerinde anlaşılan matematiksel tanımı durumlarının modülü bu bir ve b (katı pozitif) geri kalanı r bölünmesi bir / b . Daha açık bir şekilde, 0 <= r < b tanımı aracılığıyla tanımlanabilir.

Cevap 04/09/2008 saat 14:46
kaynak kullanıcı

oy
0

Sonuç diline bağlıdır. Python örneği c # temettüsünün (yani.% 2 5 döner -2 c #) işaretini verir bölen, işaretini verir.

Cevap 04/09/2008 saat 14:53
kaynak kullanıcı

oy
0

Açıklamalardan biri negatif sayılar kullanılarak depolanır olduğunu olabilir 2'ye tümleyenini . Piton tercüman modülo operasyonu yapmaya çalıştığında o imzasız değere dönüştürür. Bu tür yerine yaparken de (-2),% 5 aslında 3'tür 0xFFFF_FFFF_FFFF_FFFD% 5 hesaplar.

Cevap 04/09/2008 saat 15:12
kaynak kullanıcı

oy
4

Diğer cevaplar açıklandığı gibi, negatif değerlere sahip bir modülo işlemi için birçok seçenek vardır. Genel farklı dilde (ve farklı makine mimarileri) ise farklı bir sonuç verecektir.

Göre Python başvuru kitabı ,

Modülo operatör her zaman ikinci işlenen (ya da sıfır) aynı işarete sahip bir sonuç verir; Sonuç mutlak değeri, ikinci işlenen mutlak değerinden daha sıkı bir şekilde daha küçüktür.

Python tarafından alınan bir seçimdir. Bu her zaman geçerlidir, böylece Temelde modülo tanımlanır:

x == (x/y)*y + (x%y)

bu nedenle bu mantıklıdır (-2),% 5 = 2 - (-2/5) * 5 = 3

Cevap 04/09/2008 saat 15:25
kaynak kullanıcı

oy
0

Tüm işletim sistemleri ve mimarileri üzerinde C / C bu mod davranışı ++ güvenmek dikkat edin. Doğru hatırlamak, ben gibi C / C ++ kodunda güvenmek çalıştı

float x2 = x % n;

Bir OS derlemek ne zaman içinde 0'dan n-1 fakat negatif sayılar süzüldü aralığındaki x2 tutmak için, ama her şey başka OS üzerinde iyi çalışır olacaktır. sadece yarım saat oldu beri bu kötü zaman hata ayıklama için yapılmış!

Cevap 04/09/2008 saat 15:46
kaynak kullanıcı

oy
6

Dokümantasyon dediği gibi ikili aritmetik işlemlerin , Python olmasını sağlar:

Tam sayı bölümü ve modülo operatörleri şu kimliği ile bağlanır: x == (x/y)*y + (x%y). Tamsayı bölünmesi ve modülo da yerleşik fonksiyonu divmod () ile bağlanır: divmod(x, y) == (x/y, x%y).

Ve gerçekten,

>>> divmod(-2, 5)
(-1, 3).

Bu yöntemin homojen görselleştirmek için başka bir yol hesaplanmasıdır divmodnumaralarını küçük bir dizisi için:

>>> for number in xrange(-10, 10):
...     print divmod(number, 5)
...
(-2, 0)
(-2, 1)
(-2, 2)
(-2, 3)
(-2, 4)
(-1, 0)
(-1, 1)
(-1, 2)
(-1, 3)
(-1, 4)
(0, 0)
(0, 1)
(0, 2)
(0, 3)
(0, 4)
(1, 0)
(1, 1)
(1, 2)
(1, 3)
(1, 4)
Cevap 11/07/2010 saat 23:18
kaynak kullanıcı

oy
0

terimleri "modülo" ve "geri kalan" arasında ortak karışıklık var gibi gözüküyor.

Matematik olarak, kalan gerektiğini hep böylece eğer bölüm ile tutarlı tanımlanabilir a / b == c rem dsonra (c * b) + d == a. Eğer sayının yuvarlamak nasıl bağlı olarak, farklı kalıntılar olsun.

Ancak, modülo hep bir sonuç vermelidir 0 <= r < divisornegatif tamsayılar izin verirse yuvarlak to-eksi-sonsuz bölümü ile sadece tutarlıdır. Bölme (ortak olan) sıfıra doğru mermi halinde, modül ve geri kalan olmayan negatif değerler sadece eşdeğerdir.

Bazı diller (C ve C ++) gerekli yuvarlama / kalan davranışları tanımlamak ve yok %belirsizdir. Birçok sıfıra doğru olarak yuvarlama tanımlar, ancak geri kalan daha doğru olacaktır terimi modulo kullanın. Negatif sonsuza yuvarlar, yani modülo ve geri kalan eşdeğer olduğunu Python nispeten nadir bir durumdur.

Ada sıfır IIRC doğru yuvarlar, ancak her iki sahiptir modve remoperatörler.

C politikası derleyicileri makine için en verimli uygulanmasını seçmesine izin amaçlanmıştır, ancak IMO, en azından bu günlerde sahte optimizasyon mesafesindedir. İyi bir derleyici muhtemelen (eğer imzasız türlerini kullanıyorsa neredeyse kesin ve) negatif bir sayı oluşamaz yerde optimizasyonu için eşdeğerlik kullanmak mümkün olacak. taşınabilirliği nedeniyle size sonuçlar bakılmaksızın yuvarlanması ve geri kalan istiyorum almak sağlamak için çok dikkatli tasarlanmış aşırı karmaşık algoritmalar ve / veya kontrolleri kullanmak zorunda - negatif sayılar oluşabilir Diğer taraftan, neredeyse kesinlikle ayrıntılar önem davranışı.

Başka bir deyişle, bu "optimizasyon" için kazanç çoğunlukla (her zaman olmasa) bir yanılsama, bazı durumlarda çok gerçek maliyetler vardır oysa - bu yüzden yanlış bir optimizasyon var.

Cevap 05/03/2011 saat 12:16
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more