Sayı tabanları, bayt boyutları ve insanların tartıştığı birimler

Onaltılığın bitlerle nasıl eşleştiği, 1 TB'lik bir diskin neden 931 GB göründüğü, 0.1 artı 0.2'nin gerçekte kaç ettiği ve yuvarlamanın, yüzdelerin ve yerel biçimlendirmenin bir sayıyı nasıl sessizce değiştirdiği.

Yazılmış bir sayı iki şey taşır: bir değer ve o değerin nasıl okunacağına dair bir varsayımlar kümesi. 0xFF, 255, 0o377 ve 11111111 dört ayrı gösterimde tek bir niceliktir. Bir terabayt ile bir tebibayt arasında yüzde on fark vardır. 1,234 Londra'da kabaca bin, Berlin'de kabaca birdir. Sayısal hataların çoğu aritmetikten değil varsayımlardan gelir.

İkilik, sekizlik, onluk ve onaltılık

Her konumsal taban aynı şekilde işler. Her basamak, sağındakinin taban katıdır ve rakamlar sıfırdan taban eksi bire kadar gider. 16 tabanı altı fazladan rakam ister, bu yüzden on ile on beş için A ile F harflerini ödünç alır.

Onaltılık, baytlar ve renkler için kullanılır, çünkü 16 sayısı 2'nin 4. kuvvetidir; dolayısıyla bir onaltılık rakam tam olarak dört bit, bir bayt da tam olarak iki onaltılık rakamdır ve aralarında elde taşınmaz.

0 0000   4 0100   8 1000   C 1100
1 0001   5 0101   9 1001   D 1101
2 0010   6 0110   A 1010   E 1110
3 0011   7 0111   B 1011   F 1111

Dönüşümün tamamı bu tablodur. Onaltılıktan ikiliğe geçmek için her rakamı dört bitiyle değiştirin: 0x2F ifadesi 0010 1111 olur. Geri dönmek için bitleri sağdan başlayarak dörtlü gruplayın, solu sıfırla doldurun ve her grubu tablodan okuyun.

Onluk için basamak değerlerini kullanın. 0x2F sayısı 2 x 16 + 15, yani 47 eder. Ters yönde ise ardı ardına 16'ya bölün ve kalanları aşağıdan yukarı okuyun:

200 / 16 = 12 remainder 8   -> 8
 12 / 16 =  0 remainder 12  -> C
200 decimal = 0xC8

Sekizlik her rakama üç bit sığdırır; Unix izinlerinin 755 biçiminde yazılmasının nedeni budur: her rakam bir rwx üçlüsüdür, 7 sayısı 111, 5 sayısı 101 demektir. #FF8800 gibi bir CSS rengi, her biri kanal başına düşen ve 0 ile 255 arasında değişen üç bayttır; üç haneli kısaltma #F80 ise sıfırla doldurularak değil her hane ikiye katlanarak açılır. Number Base Converter dört tabanı da aynı anda kapsar.

İkiye tümleyen ve aralıkların nereden geldiği

Bir bayt 256 farklı örüntü tutar. İşaretsiz okunduğunda bunlar 0 ile 255 arasıdır. İşaretli okunduğunda en üstteki bit negatif yarıyı imler ve negatif bir değer, örüntüsünün 256 eksiğidir. Bu düzenin adı ikiye tümleyendir ve sıradan ikili toplamanın işaretli ile işaretsiz değerlerde birebir aynı çalışması için seçilmiştir.

Bir sayının işaretini çevirmek için her biti tersleyip bir ekleyin. Aralık simetrik değildir, çünkü sıfır negatif olmayan yarıdaki 128 yuvadan birini kaplar; dolayısıyla işaretli bir bayt -128 ile 127 arasında gider. Aralığın tepesine bir eklemek en alta sarar:

  0111 1111    127
+ 0000 0001      1
= 1000 0000   -128

Çoğu dilde hiçbir uyarı verilmez; değer öylece aralığın öbür ucunda beliriverir. 32 bitteki aynı sarma, işaretli 32 bitlik bir Unix zaman damgasının 2.147.483.647 saniyede tükendiği 2038 sorunudur. İşaretsiz 16 bit 0 ile 65.535 arasını verir; TCP port numaralarının tam da orada bitmesinin ve Random Port Generator'ın 1024 altındaki ayrılmış portlardan kaçınarak bu aralıktan çekmesinin nedeni budur.

Kilobayt, kibibayt ve kayıp gigabaytlar

Depolama üreticileri onun kuvvetleriyle sayar. İşletim sistemleri ise geçmişte ikinin kuvvetleriyle saymış ve sonucu onluk önekle etiketlemiştir; tartışma da buradan başlar. İkili önekler (KiB, MiB, GiB) bu belirsizliği ortadan kaldırmak için vardır.

Onun kuvvetiOnluk değerİkili önekİkili değerFark
kB, 10^31,000KiB, 2^101,0242.4%
MB, 10^61,000,000MiB, 2^201,048,5764.9%
GB, 10^91,000,000,000GiB, 2^301,073,741,8247.4%
TB, 10^121,000,000,000,000TiB, 2^401,099,511,627,77610.0%
PB, 10^1510^15PiB, 2^501,125,899,906,842,62412.6%

1 TB'lik bir disk satıldığı haliyle 10^12 bayt tutar. Bunu 2^30'a bölün, 931,32 elde edersiniz; Windows da ikili bir niceliği onluk etiketle sunarak yaklaşık 931 GB bildirir. Eksilen bir şey yoktur; aynı baytlar farklı bir sayıya bölünmektedir. macOS ve Linux araçlarının çoğu artık kutunun üstündekiyle uyuşan onluk GB bildirir. Bellek boyutları gerçekten ikiliktir, dolayısıyla 16 GB RAM gerçekten 16 GiB'dir.

Ağ hızları bayt değil bit ile ve her zaman onluk olarak sayılır. 100 Mbps'lik bir hat saniyede 100.000.000 bit taşır ki bu, ek yükten önce saniyede 12,5 MB eder. Protokol ek yükü yüzde birkaçını alır, dolayısıyla gerçekçi tavan saniyede 11 ila 12 MB'dır. İlan edilen megabit değerini sekize bölmek hızlı bir denetimdir ve Unit Converter depolama birimlerini kapsar.

Kayan nokta ve paranın neden float olmadığı

İkili kesirler yalnızca yarımların, çeyreklerin, sekizde birlerin ve benzerlerinin toplamlarını temsil edebilir. Onda birin, üçte birin onluk tabanda tam bir karşılığının olmaması gibi, ikili tabanda tam bir karşılığı yoktur; dolayısıyla IEEE 754 çift duyarlıklı sayı olarak saklanan 0.1 değeri onda birden birazcık büyüktür. Böyle iki yaklaşımı toplayın, hata yüzeye çıkar:

0.1 + 0.2 = 0.30000000000000004

Çift duyarlıklı bir sayının 53 bitlik anlamlı kısmı vardır. Bu da 2^53'e (9.007.199.254.740.992) kadar her tam sayıyı ve paydası ikinin kuvveti olan her kesri tam olarak temsil edilebilir kılar. 2^53'ün üstünde temsil edilebilir değerler arasındaki boşluk 2 olur, dolayısıyla 2^53 + 1 ifadesi 2^53 değerine eşittir. JSON üzerinden gönderilen 64 bitlik veritabanı tanımlayıcılarının dize olarak yolculuk etmesi gerekmesinin nedeni budur: JavaScript sayıları çift duyarlıklıdır ve 19 haneli bir kimlik son hanelerini sessizce kaybeder.

Para için tam sayı olarak alt birimleri (kuruş, cent) saklayın ya da onluk tabanda çalışan bir ondalık tip kullanın. Kayan noktalı sayıları asla eşitlikle karşılaştırmayın; farkı küçük bir toleransla kıyaslayın. Expression Calculator da çift duyarlıklı sayılarla çalışır ve aynı sınırları devralır.

Yuvarlama ve iki kez yuvarlama

Yarımı yukarı yuvarlama, tam ortadaki değeri sıfırdan uzağa gönderir. Bankacı yuvarlaması olarak da bilinen yarımı çifte yuvarlama ise tam ortadaki değeri en yakın çift rakama gönderir; bu da uzun bir rakam sütununda yarımı yukarı yuvarlamanın getirdiği yukarı yönlü yanlılığı ortadan kaldırır. IEEE 754'ün varsayılanıdır ve birkaç muhasebe standardında da kural budur.

DeğerYarımı yukarıYarımı çifte
0.510
1.522
2.532
3.544
-0.5-10

Bir kez, özgün değerden yuvarlayın. 2,4449 sayısını üç ondalık basamağa yuvarlamak 2,445 verir, onu ikiye yuvarlamak 2,45 verir; oysa özgün değeri doğrudan ikiye yuvarlamak 2,44 verir. Ara sütunlar üzerinden zincirleme yuvarlama, toplamların bir kuruş şaşmasının sık görülen nedenidir. Buna bağlı bir sürpriz: 2,675 sayısı çoğu dilde 2,67'ye yuvarlanır, çünkü saklanan çift duyarlıklı değer 2,67499999999999982'dir.

Yüzde ve yüzde puanı

%4'ten %5'e çıkan bir oran bir yüzde puanı, göreli olarak ise %25 artmıştır. İkisi de doğrudur ve birimin belirtilmesi gerekir.

Yüzde değişimleri birbirini götürmez. %50'lik bir düşüşün ardından %50'lik bir artış geriye 100 değil 75 bırakır, çünkü ikinci yüzde daha küçük bir tabandan alınır. p kadarlık bir düşüşü telafi etmek p / (1 - p) kadar bir artış gerektirir, dolayısıyla %50'lik bir düşüş %100, %80'lik bir düşüş ise %400 ister. Art arda gelen değişimler çarpılır ve toplam değil geometrik bir dizi oluşturur; Number Sequence aracının modellediği büyüme de budur.

Eski bir değerden yenisine değişim (yeni - eski) / eski x 100 ile bulunur; Percentage Calculator'ın fark olarak bildirdiği de budur. %20 KDV'yi çıkarmak, %20 eksiltmek değil 1,2'ye bölmek demektir. Farklı büyüklükteki gruplar arasında yüzdelerin ortalamasını almak, ortalama ağırlıklandırılmadıkça yanlış bir genel değer verir; Sum and Average'ın ortalamanın yanında ortancayı da göstermesi çarpıklığı görünür kılar.

Bir yerel ayara göre biçimlenmiş sayılar

Biçimlendirme bir gösterim kararıdır ve yerel ayar bilinmeden geri alınamaz. 1.234 Birleşik Krallık'ta bir küsur, Almanya'da bindir. 1,234 ise tersidir. Bazı yerel ayarlar bunun yerine boşlukla ya da kesme işaretiyle gruplar.

Yerel ayar1234567.89
en-GB, en-US1,234,567.89
de-DE1.234.567,89
fr-FR1 234 567,89
de-CH1'234'567.89
en-IN12,34,567.89

Hint gruplaması ilk ayırıcıyı üç haneden sonra, sonrakileri ise iki hanede bir koyar; böylece binler ve milyonlar yerine lakh ve crore çıkar. Biçimlenmiş bir dizeyi tekrar sayıya ayrıştırmak tam da bu yüzden kayıplıdır, dolayısıyla değerleri biçimlendirmeden ve ondalık ayırıcı olarak nokta ile saklayıp iletin, biçimlendirmeyi yalnızca gösterim anında yapın. Bir sayının okuyucu için kesinlikle tek anlamlı olması gerektiğinde, Number to Words ile yazıyla açmak çeklerde ve sözleşmelerde alışılmış yoldur. Roma rakamları bütün bunların dışında durur: basamak değeri ve sıfır olmadığı için Roman Numeral Converter bir tabanı değil bir çeteleyi işler.