Mod (%) neden birçok programlama dilinde temel bir matematik operatörüdür?


17

Tarihsel veya başka türlü, neden modül operatörünün birçok dilde görünen küçük bir standart operatör grubunun parçası olmasının bir nedeni var mı? ( +, -, *, /ve %Java ve C için **Ruby ve Python ile).

Modun bir "temel" olarak dahil edilmesi garip görünüyor (onu çalmamak için, bolca kullanıyorum, ama aynı zamanda üs, mutlak değer, zemin / tavan veya diğerleri de kullanıyorum - onlar da yararlı ve gerekli görünüyorlar). Bu, Java, C, Ruby ve Python'un takip ettiği bazı spesifikasyonlarda mı yoksa hepsinin hangi dilde olduğuna dair eski bir karar mıydı? Bildiğim kadarıyla çoğu Lisp lehçesi sadece +, -, /ve içerir *.

İlk başta modun ikili düzeyde uygulanmasının özellikle kolay olup olmadığını merak ettim (neyin "temel" bir operatör olması ve neyin olmaması gerektiğine dair kararlarla ilgili bir fark yaratabilir mi?) Ama öyle görünmüyor. Programlamada düşündüğümden çok daha sık mı kullanılıyor?

Yanıtlar:


20

Yaygın olduğundan eminim çünkü birçok CPU mimarisi modulustamsayı bölme komutunun ikinci çıktısı olarak uygulanmaktadır .

1970'lerde CPU'larda (6800, 8080, Z80, 1604 vb.) Mevcut olduğunu hatırlamıyorum, ancak 1980'lerde Intel 8086 ve 8088 ve Motorola 6809'da vardı.

PDP-11 öğretim mimarisi DIV, MUL ve DIV talimatları erken tasarımlarda mevcut olmasa da, bir bölüm ve geri kalan kısım (1970) üretmeyi belirledi , ancak "talimat tuzağı uygulanmayan talimat" ile şeffaf bir şekilde taklit edilebilir ve biraz çevirme işleyici. Muhtemelen PDP-11 özelliği, bu %özelliği sağlayan C dilinin ilk baskısını teşvik etti . (Yüzde işaretinin nasıl bir eğik çizgi olduğunu fark ettiniz mi? Bu, bölünmeyle ilgili bir operatör için akıllıca bir seçimdir.)

CTek başına modülün varlığı muhtemelen tüm modern dillerdeki varlığını açıklayabilir. Cçok geniş bir torun ailesine sahip ve aksi halde oldukça etkili oldu.


3
+1 C'nin 1970'lerin başından beri LISP olmayan her dil üzerindeki etkisi abartılamaz.
Ross Patterson

8

Birçok programlama dili, her iki işlenen de pozitif olduğunda bir modül operatörü olarak kullanılabilen bir "geri kalan" operatöre sahiptir; adı geçen operatöre genellikle "modül" operatörü denir, çünkü bu onun birincil kullanımıdır. Diller genellikle böyle bir operatöre sahiptir, çünkü birçok donanım platformunun bölme donanımı bir bölme gerçekleştirirken otomatik olarak bir geri kalan kaynağı sağlar ve başka bir yolla bir kalan veya modülün hesaplanması çok daha zor olacaktır.

İmzalı bölüm için donanım desteğinin geçmişini bilmiyorum; Birçok işlemci yıllarca, eğer a / b verirse (q, r), o zaman -a / b veya a / -b'nin vereceği (-q, -r), ancak Bu kuralı kullanarak bölünmenin özellikle yararlı olduğu kullanım durumlarından emin değilim. Negatif değerler üzerinde tamsayı bölme veya "modül" işlemleri kullandığım hemen hemen her durumda, bölme üzerinde negatif-sonsuz-sonsuzluk ve gerçek bir modül işlemi istedim (öyle ki (a + b) / b her zaman eşittir (a / b) +1 ve (a + b)% b her zaman% b'ye eşittir.). Operatörler bu şekilde çalışmadığından, temettü işaretini test etmek ve s negatif - esasen imzalı bir bölünme talimatına sahip olmanın herhangi bir faydasını reddetmek. Donanımda imzalı bölüm desteğinin gerçekten hangi amaçlarla yararlı olduğunu merak ediyorum.

Orijinal soruya dönersek, modül operatörü, belirli şeylerin periyodik olarak, uzayda (örneğin grafik koordinatlar) veya zamanda olması gerektiği durumlarda genellikle yararlıdır. Tek bir olay var istiyorsa Örneğin, her 15 saniyede bir olur, bir sonraki etkinliğe kadar süresi 15 olacak - ((time_now - time_of_an_occurrence)% 15), varsayarak time_of_an_occurrencedaha büyük değildirtime_now . Daha time_of_an_occurrencebüyük olsaydı time_now, bir modül operatörü çıkarma işleminin taşmaması koşuluyla aynı formülü kullanmaya devam edebilirdi, ancak geri kalan operatör farklı bir formül gerektirecektir.


3
Bu nedenle, Haskell'in iki operatörü vardır: remgeri kalanı için ve modtarif ettiğiniz özelliklerle modül için.
Ingo

@Complicatedseebio: Özellikle komik olan, genellikle modül operatörü olarak adlandırılmasıdır, çünkü genellikle kod gerektirdiğinde bile modülü hesaplamak için kullanılır m = number % base; if (m < 0) m+=base;. Kalan operatörün negatif gitmesinden yararlanan herhangi bir kod gördüğümü bilmiyorum, belki de q = n/d; if (n%d < 0) q+=1;, her durumda başka şekillerde daha iyi yazılabilir.
Supercat

3

Modül, çok temel matematiksel teoriler olan grup ve halka teorisi ile yakından ilişkilidir.

Üs, sekans ekleme, çarpma, üs alma, tetrasyondaki üçüncü işlemdir (ve bu sonsuz bir sekanstır). Temelde bilgisayar aritmetiğinde daha nadir olan karmaşık sayılarla önem kazanmaktadır. Bununla birlikte, belirli bir üs açıkça desteklenmektedir: 2 n , 1<<nbilgisayarlar oldukça ikili olduğu için yaygın olarak yazılmaktadır .

Zemin ve tavan karşılaştırmada gerçekten nadirdir: Sadece ℝ'den ℤ'ye dönüştürülürken geçerlidir. (kayan noktadan tamsayıya). Benzer şekilde, absℤ ile ℕ arasındaki bir eşleme ile ilişkilidir


ℤ tamsayılardır (ve ℕ tamsayıların bir alt kümesidir), ℝ ile ℤ arasında bir anlam ifade etmelisiniz.
Joni

@Joni: Karışık iki örnek düzeltildi.
MSalters

0

Maalesef, bunu "Call My Bluff" oyununa çevirme riski altında olduğunu düşünüyorum. Bu sorunun gerçek cevabı oldukça basit:

Mod, "ondalık olmayan" miktarlarda ve tarih, saat, yarda, inç, ons vb. Gibi birimlerde kesin hesaplamalar yapılmasına olanak tanır. makinenin. Bu, çok küçükten (örneğin kuantum hesaplamaları) çok büyüğe (örn. Yeni asal sayıların keşfedilmesi) kadar çok sayıda uygulamaya sahiptir.

Bu şeyleri bir sebepten dolayı bilgisayar olarak adlandırdığımızı anlamak önemlidir. Bazen bize doğru cevabı vermeliyiz!


Bu cevap bir anlam ifade etmiyor ... "mod" ile farklı birimleri kullanmak arasındaki bağlantı nedir ???
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.