I olarak temsil numara tayflarını görmüş [first1,last1)
ve [first2,last2)
.
Böyle bir gösterimin ne anlama geldiğini bilmek istiyorum.
I olarak temsil numara tayflarını görmüş [first1,last1)
ve [first2,last2)
.
Böyle bir gösterimin ne anlama geldiğini bilmek istiyorum.
Yanıtlar:
Köşeli ayraç, aralığın sonunun kapsayıcı olduğu anlamına gelir - listelenen öğeyi içerir. Parantez, sonun özel olduğu ve listelenen öğeyi içermediği anlamına gelir . Dolayısıyla [first1, last1)
, aralık ile başlar first1
(ve onu içerir), ancak hemen önce biter last1
.
Tam sayılar varsayarsak:
Bu yarı açık bir aralık .
[a,b]
içerir .(a,b)
hariç tutar .Sizin durumunuzda, aralığın başlangıcındaki bitiş noktası dahil edilir, ancak bitiş hariçtir. Yani "ilk1 <= x <son1" aralığı anlamına gelir.
Yarı açık aralıklar programlamada kullanışlıdır çünkü döngü için ortak deyime karşılık gelirler:
for (int i = 0; i < n; ++i) { ... }
Burada i [0, n) aralığındadır.
Aralık gösterimi kavramı hem Matematik hem de Bilgisayar Bilimlerinde ortaya çıkmaktadır . Matematiksel gösterimde [
, ]
, (
, )
belirtmektedir alan (ya da bir dizi bir aralığın).
Parantez [
ve ]
anlamı:
Parantez (
ve )
anlamı:
Karışık durumlara sahip bir aralığa "yarı açık" denir .
Örneğin, 1 .. 10 (dahil) arasındaki ardışık tamsayı aralığı şu şekilde belirtilir :
Kelimenin nasıl inclusive
kullanıldığına dikkat edin . Bitiş noktasını hariç tutmak , ancak aynı aralığı "kapsamak" istiyorsak , bitiş noktasını taşımamız gerekir:
Aralığın hem sol hem de sağ kenarları için aslında 4 permütasyon vardır:
(1,10) = 2,3,4,5,6,7,8,9 Set has 8 elements
(1,10] = 2,3,4,5,6,7,8,9,10 Set has 9 elements
[1,10) = 1,2,3,4,5,6,7,8,9 Set has 9 elements
[1,10] = 1,2,3,4,5,6,7,8,9,10 Set has 10 elements
Bunun Matematik ve Bilgisayar Bilimleri ile nasıl bir ilişkisi var?
Dizi dizinleri , içinde olduğunuz alana bağlı olarak farklı bir uzaklık kullanma eğilimindedir :
Bu farklılıklar, for-loop'lar gibi Matematiksel algoritmaları uygularken , örtük çit sonrası hatalarına , yani tek tek hatalara yol açabilir .
Örneğin ilk birkaç asal sayı [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ]
gibi bir kümemiz veya dizimiz varsa , Matematikçiler ilk öğeye 1st
mutlak öğe olarak başvururlar . Örneğin, indeksi belirtmek için alt simge gösteriminin kullanılması:
Bazı programlama dilleri, aksine, ilk öğeye zero'th
göreceli öğe olarak atıfta bulunur .
Dizi indeksleri [0, N-1] aralığında olduğundan, o zaman açıklık amacıyla, 0 .. N aralığı için aynı sayısal değeri, örneğin a gibi metinsel gürültü eklemek yerine tutmak "güzel" olacaktır.-1
sapma .
Örneğin, C veya JavaScript'te, bir N öğe dizisi üzerinde yineleme yapmak için bir programcı i = 0, i < N
, biraz daha ayrıntılı [0, N-1] yerine [0, N) aralığı ile ortak deyimini yazar :
function main() {
var output = "";
var a = [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ];
for( var i = 0; i < 10; i++ ) // [0,10)
output += "[" + i + "]: " + a[i] + "\n";
if (typeof window === 'undefined') // Node command line
console.log( output )
else
document.getElementById('output1').innerHTML = output;
}
<html>
<body onload="main();">
<pre id="output1"></pre>
</body>
</html>
Matematikçiler, 1'den saymaya başladıkları için bunun yerine i = 1, i <= N
isimlendirmeyi kullanırlar, ancak şimdi sıfır tabanlı bir dilde dizi ofsetini düzeltmemiz gerekiyor.
Örneğin
function main() {
var output = "";
var a = [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ];
for( var i = 1; i <= 10; i++ ) // [1,10]
output += "[" + i + "]: " + a[i-1] + "\n";
if (typeof window === 'undefined') // Node command line
console.log( output )
else
document.getElementById( "output2" ).innerHTML = output;
}
<html>
<body onload="main()";>
<pre id="output2"></pre>
</body>
</html>
Kenara :
0 tabanlı olan programlama dilleri size bir gerekebilir kludge bir Matematiksel 1 tabanlı algoritma kullanmak için bir kukla zero'th elemanın. ör. Python Dizini Başlangıcı
Aralık gösterimi, kayan noktalı sayılar için ince hatalardan kaçınmak için de önemlidir.
Özellikle Bilgisayar Grafiklerinde kayan nokta sayıları ile uğraşırken (renk dönüşümü, hesaplama geometrisi, animasyon hareket hızı / karıştırma, vb.) Çoğu kez normalleştirilmiş sayılar kullanılır. Yani 0,0 ile 1,0 arasındaki sayılar.
Uç noktaların kapsayıcı mı yoksa dışlayıcı mı olduğu uç durumları bilmek önemlidir :
M'nin bir makine epsilon olduğu yerde . Bu nedenle, bazen 32 bitlik bir kayan nokta sayısı için const float EPSILON = 1e-#
C kodunda (örneğin 1e-6
) deyim görebilirsiniz . Bu SO sorusu EPSILON herhangi bir garanti veriyor mu? bazı ön detaylara sahiptir. Daha kapsamlı bir yanıt için bkz. FLT_EPSILON
Ve David Goldberg'in Kayan Nokta Aritmetiği Hakkında Her Bilgisayar Bilimcisinin Bilmesi Gerekenler
Bazı rasgele sayı üreteci uygulamaları random()
, daha uygun olan 0.0 .. 1.0 yerine 0.0 .. 0.999 ... aralığında değerler üretebilir. Koddaki uygun yorumlar bunu [0.0,1.0) veya [0.0,1.0] olarak belgeleyecektir, bu nedenle kullanım konusunda belirsizlik yoktur.
Misal:
random()
Renkler yaratmak istiyorsunuz . Sırasıyla kırmızı, yeşil ve mavi kanallarla 24 bit piksel oluşturmak için üç kayan nokta değerini işaretsiz 8 bitlik değerlere dönüştürürsünüz. random()
Sizin tarafınızdan verilen aralığa bağlı olarak near-white
(254,254,254) veya white
(255,255,255) ile sonuçlanabilir. +--------+-----+
|random()|Byte |
|--------|-----|
|0.999...| 254 | <-- error introduced
|1.0 | 255 |
+--------+-----+
Kayan nokta hassasiyeti ve aralıklarla sağlamlığı hakkında daha fazla ayrıntı için Christer Ericson'ın Gerçek Zamanlı Çarpışma Algılama , Bölüm 11 Sayısal Sağlamlık , Bölüm 11.3 Sağlam Kayan Nokta Kullanımı'na bakın .
[first, last)
diğerlerinin de belirttiği gibi yarı açık bir aralıktır. Bazı ders kitaplarında, bu da[first, last>
aynı anlama gelir ve aynı anlama sahiptir, sadece sözdizimi farklıdır.