Sementara saya pemrograman di C ++ beberapa hari yang lalu, saya membuat kesalahan ini (bahwa saya memiliki sejarah membuatnya!). Di salah satu bagian dari kode saya, saya memiliki 1/6 dan saya mengharapkannya menjadi 0,16666666666 yang tidak demikian. Seperti yang Anda ketahui hasilnya adalah 0 - C, C ++, Java, Python, semua berperilaku sama.
Saya mempostingnya di halaman Facebook saya dan sekarang ada perdebatan tentang apakah ada bahasa pemrograman di mana 1/6
berperilaku sama seperti 1.0/6.0
.
programming-languages
Pouya
sumber
sumber
>> 1 / 6
->== 0.166666666666667
1/6
sebenarnya 1/6 (tipe fraksional) yang, dipaksa untukDouble
, adalah 1.66666 ...Jawaban:
Apakah semua orang lupa Pascal?
1/6
hasil0.1666666...
(dengan presisi apa pun didukung).1 div 6
hasil panen0
Dapat diperdebatkan apakah aturan C adalah kesalahan. Hampir semua operator aritmatika C, di mana operan memiliki tipe yang sama, menghasilkan hasil dari tipe yang sama. Ada sesuatu yang bisa dikatakan untuk konsistensi.
Selain itu, karena C terutama ditargetkan pada kode tingkat sistem, sebagian besar program C tidak menggunakan floating-point sama sekali. Pada suatu waktu, secara tidak sengaja menambahkan kode floating-point ke program yang sebaliknya tidak memerlukannya bisa menjadi masalah serius. Itu mungkin masih terjadi, untuk sistem tertanam kecil - yang, sekali lagi, merupakan target utama untuk C.
Di sebagian besar program C, memotong divisi integer mungkin adalah apa yang Anda inginkan.
Jika
1 / 6
menghasilkan hasil floating-point dalam C, maka:double
mungkin tampak seperti pilihan yang alami, tetapi Anda mungkin lebih suka presisi tambahanlong double
)C dapat menyediakan operator terpisah untuk dua jenis divisi, tetapi poin kedua di atas masih berlaku: mana dari tiga jenis floating-point yang akan digunakan untuk hasilnya? Dan karena cukup mudah untuk mendapatkan pembagian floating-point jika Anda membutuhkannya (gunakan konstanta floating-point untuk satu atau kedua operan, atau melemparkan satu atau kedua operan ke tipe floating-point), tampaknya tidak tidak dianggap penting.
Dalam versi C manual 1974 (itu 4 tahun sebelum penerbitan edisi pertama K&R), Ritchie bahkan tidak menyebutkan kemungkinan kebingungan:
yang mengatakan bahwa jika kedua operan bertipe
int
atauchar
, hasilnya bertipeint
.Ya, ini merupakan sumber kebingungan bagi sebagian programmer C, terutama pemula - tetapi C tidak terkenal karena sangat ramah-pemula.
sumber
1.666666...
, yang jelas salah. Alasan lumpuh saya adalah bahwa program tes Pascal yang saya tulis dicetak1.6666666666666667E-0001
Sebenarnya perilaku ini diubah dalam Python 3 dan sekarang berperilaku seperti yang Anda harapkan (
//
sekarang digunakan untuk pembagian integer).sumber
/
selalu menghasilkan nilai floating-point, dan operator terpisah (div
) digunakan untuk pembagian integer.Di luar bahasa yang menonjol, JavaScript. 1.0 / 6.0 = 1/6 = 0.16666666666666666.
Saya tidak melihat ini mengejutkan. Sebagai aturan praktis, jika suatu bahasa membedakan antara tipe angka integer dan floating point, membagi dua integer akan menghasilkan integer terpotong alih-alih float. Jika tidak, kemungkinan besar akan default ke operasi floating point. Ini harus menjadi perilaku yang diharapkan pada bagian programmer.
Hanya perlu diingat bahwa ada hal-hal tambahan yang juga bisa berperan di sini, seperti operator divisi integer yang telah disebutkan sebelumnya atau tipe casting implisit.
sumber
Ada banyak bahasa di mana
((1/6)*6)
hasil dalam 1, bukan dalam 0. Misalnya, PL / SQL, banyak dialek BASIC, Lua.Secara tidak sengaja, di semua bahasa tersebut hasil 1/6 dalam 0,166666667, atau 0,1666666666666767 atau sesuatu yang serupa. Saya memilih varian ((1/6) * 6) == 1 untuk menghilangkan perbedaan kecil itu.
sumber
((1/6)*6)==1
varian untuk menghilangkan perbedaan kecil itu, tetapi sepertinya saya melebih-lebihkan kemampuan matematika beberapa orang.Haskell memperlakukan 1/6 dan 1.0 / 6.0 sebagai identik 0,16666666666666666. Ini juga menjadikan 1 / 6.0 dan 1.0 / 6 sebagai nilai yang sama juga.
Ini karena tipe numerik dasar di Haskell tidak sama dengan bahasa lain. Divisi integer sejati agak ... rumit.
sumber
Ya, Perl. Satu garis
menghasilkan output dari:
Saya percaya bahwa PHP bekerja dengan cara yang sama.
Diedit untuk menambahkan: Saya juga percaya bahwa syarat yang diperlukan (tetapi tidak cukup)
1/6 == 1.0/6.0
adalah untuk bahasa yang dimaksud diketik dengan lemah.sumber
/
secara otomatis kelebihan tergantung pada jenis argumen, tapi itu sepertinya pelanggaran terhadap Prinsip Least Astonently untuk saya ...Dalam mencicit Smalltalk
/
pada bilangan bulat menciptakan objek pecahan. Jadi sementara ini tidak sama dengan divisi float, masih(1/6)*6
mengembalikan 1.sumber
Ya, saya baru saja memeriksa TI-99 / 4A saya yang dibangun di TI BASIC . Karena memperlakukan semua ekspresi numerik sebagai titik mengambang, operasi divisi juga merupakan titik mengambang.
sumber
VB ( VB.Net , VB6 , VBA ...)
Operator divisi integer adalah \
sumber
MATLAB. Numeric literals secara standar digandakan.
sumber
Clojure memang menggunakan pecahan secara default. Ini tidak sama dengan 1.0 / 6.0, tetapi Anda dapat mengubahnya dengan
float
ataudouble
ketika Anda membutuhkannya.sumber
Anehnya, tampaknya berfungsi dengan baik di Windows PowerShell (versi 3) .
Tampaknya juga berfungsi di Python 3 seperti yang disebutkan sepp2k. Dua bahasa lain yang saya sudah tersedia di REPL, Scala dan Ruby, keduanya melakukan pembagian integer dan menghasilkan 0.
sumber
Bahasa Rexx selalu menghasilkan jawaban yang benar secara hitung. Sebagai contoh: 5/2 = 2.5. Rexx adalah bahasa yang bagus yang belum cukup dimanfaatkan. Secara teori, ketika kompiler tidak dapat menentukan apa yang Anda inginkan, lebih baik melakukan matematika yang benar, namun, ini mungkin tidak efisien. Rexx juga menyediakan operator //.
sumber