Penomoran bulan berbasis nol [tutup]

98

Beberapa bahasa pemrograman populer menggunakan penomoran bulan yang dimatikan 1 - JavaScript muncul dalam pikiran, seperti halnya Java, dan jika memori berfungsi, C adalah hal lain. Saya punya beberapa pertanyaan:

  • Jika akan mengabaikan penomoran bulan yang digunakan oleh orang awam, lalu mengapa tidak demi konsistensi abaikan juga penomoran hari yang digunakan oleh orang awam, dan nomor hari dalam setiap bulan dimulai dari 0?
  • Mengapa ini sangat umum?
  • Ide siapa ini sejak awal?
Robert L
sumber
Array, mulai dari 0, dan orang mengacu pada hari dengan angka?
glasnt
13
@TomatoSandwich: cukup sering orang menyebut bulan dengan angka, dan mereka menomori mereka mulai dari 1 .
Robert L
2
Pemrogram API bukanlah dewa; terkadang kesalahan masuk ke dalam implementasi; tangani saja. Bukan berarti ini benar-benar kasus (Anda bahkan tidak mengatakan bahasa apa), tetapi jangan berharap semuanya sempurna. Saya kagum ingin tahu alasannya.
Noon Silk
5
Di Jepang, mereka hanya menggunakan angka. Mereka tidak menggunakan Januari, Februari, dll. Dunia Barat juga sangat sering menggunakan angka. Saya berharap mereka tidak pernah membuat bahasa pemrograman lain yang memilih gaya array daripada gaya bahasa lisan lagi. Ini perbaikan sederhana untuk sesuatu yang akan digunakan jutaan kali.
Wolfpack'08
1
Setuju, meski bukan pelanggaran gantung, siapa pun yang melakukan ini hanya menyia-nyiakan sepuluh menit waktuku dan pantas mendapat tamparan dengan ikan basah berukuran sedang.
James McCormack

Jawaban:

53

Penggunaan nol untuk mulai menghitung sebenarnya adalah trik pengoptimalan dari programmer Assembly. Alih-alih menugaskan 1 ke register hitungan, mereka melakukan XOR pada register itu sendiri, yang sedikit lebih cepat dalam siklus CPU. Ini berarti bahwa penghitungan akan dimulai dengan 0 dan akan selalu menggunakan panjang elemen, tidak termasuk yang terakhir.

Selain itu, penggunaan nol juga populer dengan aritmatika penunjuk di mana Anda akan menggunakan satu penunjuk dasar yang menunjuk ke beberapa memori yang dialokasikan, ditambah penunjuk kedua yang akan menjadi offset dari penunjuk dasar ini. Di sini, menggunakan nilai nol sangat masuk akal untuk mengarahkan offset ke dasar blok memori. (Logika array umum cenderung menjadi alamat dasar ditambah ukuran catatan x offset.)

Dan angka bulan berbasis nol? Seringkali, banyak lingkungan pemrograman menghitung data sebagai jumlah hari sejak beberapa data default. Tanggal 31 Desember 1899 adalah tanggal yang populer, meskipun ada banyak tanggal lain yang digunakan sebagai tanggal dasar. Semua tanggal lain diimbangi dari basis ini, dan hanya akan disimpan sebagai satu nomor tunggal. Pecahan akan digunakan untuk menunjukkan jam, menit dan detik, di mana 0,25 akan menjadi 24/4 = 6 jam. Jadi, untuk mengubah tanggal menjadi tanggal nyata, yang perlu dilakukan lingkungan adalah mengubah angka ini menjadi tanggal nyata.

Namun, kombinasi array berbasis nol dan nilai bulan berbasis 1 memang membawa masalah. Untuk mendapatkan nama bulan dari bulan 9, Anda harus mendapatkan item 8 dari array bulan. Beberapa pengembang akan senang dengan pengurangan nomor bulan sebelum mendapatkan namanya. Yang lain lebih suka mengubah bulan menjadi sesuatu yang berbasis nol karena orang hanya ingin tahu namanya, bukan nomornya. Itu pandangan pribadi.

Wim ten Brink
sumber
92
Konstruktor JavaScript dan AS3 Date mengambil nilai nyata untuk semua "kecuali" bulan, yang karena alasan yang tidak diketahui harus ditetapkan sebagai berbasis nol. Tidak diragukan lagi itu adalah desain API yang buruk.
Triynko
3
Saya setuju. Ini hanya menghabiskan satu jam saya mencoba mencari tahu mengapa kencan saya sebulan. Sangat tidak masuk akal jika semuanya berbasis 1 kecuali untuk bulannya. Sayangnya, ini mungkin tidak dapat diperbaiki, jika tidak, kami akan berakhir dengan masalah Y2K lain :-).
mike gold
1
Tl; dr: Karena array lookup monthName[monthNumber]atau mon_name[tm_mon]dengan notasi time.h .
Perseids
Hal XOR-dengan-dirinya sendiri adalah sedikit ikan haring merah; itu adalah hal Intel. MPU lain memiliki cara lain untuk nol register; beberapa memiliki cara yang efisien untuk mengaturnya ke 1 juga. Alasan utama untuk hal-hal berbasis nol adalah kalkulasi indeks; terkadang mereka juga berguna untuk aritmatika.
alastair
6

Itu adalah apa adanya, dan berat perangkat lunak yang dibangun untuk asumsi itu berarti itu akan ada untuk sementara waktu.

Pendapat saya adalah bahwa itu adalah kesalahan C, dan semua bahasa Johnie-come-baru-baru ini cocok dengannya.

Anda mendapatkan beberapa situasi lucu dari orang yang tidak tahu lebih baik. Salah satu dari sedikit bug Y2K yang ditemukan tim kami adalah situs web yang dengan bangga menyatakan tahun 19100 hanya karena mereka mengawali struct tmtahun dengan literal "19".

paxdiablo
sumber
Setidaknya satu orang (bukan saya) telah mendefinisikan fungsi "getRealMonth" dan "setRealMonth" untuk digunakan dalam skripnya. Saya tidak menyalahkan dia sedikit pun.
Robert L
1
Suara positif untuk referensi bug Y2K.
Justus Romijn
4

Ya, orang Romawi juga bermasalah dengan nol.

Ini hanyalah konsekuensi [non-intuitif] matematika (menjadi komponen yang kuat dari pemrograman, terutama pemrograman awal) yang mendefinisikan nol sebagai bilangan asli pertama (istilah bermasalah yang satu) nyata, positif *, dan karena sebuah array diindeks dengan nyata , bilangan asli elemen "pertama" ada di indeks 0.

Bulan benar-benar dinamai nilai dalam larik, di mana hari dan tahun adalah nilai bernomor - mungkin akan lebih berguna untuk menganggap hari / tahun sebagai larik yang terlihat seperti {"1", "2", "3",. ..} sendiri.

Mengenai mengapa ini sangat umum (selain benar secara matematis), semua bahasa yang Anda daftarkan berasal dari asal yang sama untuk satu hal ...

Edit:

Melihat lebih jauh ke dalamnya, ini tautan wikipedia merinci beberapa alasan bagus dan menarik untuk pengindeksan nol (yang tidak secara langsung berbicara tentang mengapa bulan tidak diindeks tetapi saya pikir itu sudah dibahas), dan tautan SO ini telah menjawab pertanyaan sebelumnya.

Sepertinya opini yang berlaku adalah "kecelakaan bersejarah" atau "karena bulan bukan angka jadi tidak bisa dibandingkan dengan penyimpanan hari / tahun" tergantung pada siapa Anda bertanya.

* Maaf, maaf, fisika! = Matematika kembali menggigit saya di sana. Pergi untuk menyetrika tanganku sekarang.

annakata
sumber
5
Nol bukanlah bilangan positif. Ini juga bukan angka negatif.
Robert L
Poin bagus, mungkin Anda harus mengubahnya menjadi "bilangan asli".
paxdiablo
1
Menarik, saya selalu berpikir bahwa array C mulai dari 0 untuk menyederhanakan aritmatika pointer: a[0]== *(a + 0).
terlalu banyak php
2
Sebenarnya, dalam komputasi, Anda bisa mendapatkan nol positif dan negatif jika Anda menggunakan sistem komplemen Ones. Untungnya, sistem tersebut hampir tidak pernah digunakan lagi. Lihat en.wikipedia.org/wiki/Ones'_complement#Ones.27_complement
Wim ten Brink
Bulan juga merupakan angka, sama seperti hari dalam budaya kita. Bulan pertama dalam satu tahun sebenarnya disebut "bulan ke-1", dan bulan terakhir disebut "bulan ke-12"
Michael Tsang