Apakah ini ditentukan oleh bahasa? Apakah ada maksimum yang ditentukan? Apakah berbeda di browser yang berbeda?
javascript
math
browser
cross-browser
TALlama
sumber
sumber
1n << 10000n
adalah bilangan bulat yang benar-benar besar, tanpa kehilangan presisi, tanpa memerlukan dependensi (dan tidak perlu dikatakan, bahkan tidak mendekati batas).Jawaban:
JavaScript memiliki dua tipe angka:
Number
danBigInt
.Jenis nomor yang paling sering digunakan
Number
,, adalah 64-bit floating point nomor IEEE 754 .Nilai integral pasti terbesar dari jenis ini adalah
Number.MAX_SAFE_INTEGER
, yaitu:Untuk menempatkan ini dalam perspektif: satu kuadriliun byte adalah petabyte (atau seribu terabyte).
"Aman" dalam konteks ini mengacu pada kemampuan untuk mewakili bilangan bulat dengan tepat dan membandingkannya dengan benar.
Dari spec:
Untuk menggunakan bilangan bulat yang lebih besar dari ini dengan aman, Anda harus menggunakan
BigInt
yang tidak memiliki batas atasPerhatikan bahwa operator bitwise dan operator shift beroperasi pada bilangan bulat 32-bit, jadi dalam kasus itu, bilangan bulat aman max adalah 2 31 -1, atau 2.147.483.647.
Catatan teknis tentang masalah angka 9.007.199.254.740.992: Ada representasi IEEE-754 yang tepat dari nilai ini, dan Anda dapat menetapkan dan membaca nilai ini dari variabel, jadi untuk aplikasi yang dipilih dengan sangat hati-hati dalam domain bilangan bulat kurang dari atau sama dengan nilai ini, Anda bisa memperlakukan ini sebagai nilai maksimum.
Dalam kasus umum, Anda harus memperlakukan nilai IEEE-754 ini sebagai tidak eksak, karena tidak jelas apakah itu mengkodekan nilai logis 9,007,199,254,740,992 atau 9,007,199,254,740,993.
sumber
4294967295 === Math.pow(2,32) - 1;
> = ES6:
<= ES5
Dari referensi :
Tampilkan cuplikan kode
sumber
Number.MIN_VALUE
adalah angka positif sekecil mungkin . Nilai terkecil (yaitu kurang dari yang lain) mungkin-Number.MAX_VALUE
.Number.MIN_SAFE_INTEGER
danNumber.MAX_SAFE_INTEGER
Ini adalah 2 53 == 9 007 199 254 740 992. Ini karena
Number
s disimpan sebagai floating-point dalam mantissa 52-bit.Nilai minimumnya adalah -2 53 .
Ini membuat beberapa hal menyenangkan terjadi
Dan juga bisa berbahaya :)
Bacaan lebih lanjut: http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html
sumber
i += 1000000000
Dalam JavaScript, ada nomor yang disebut
Infinity
.Contoh:
Ini mungkin cukup untuk beberapa pertanyaan tentang topik ini.
sumber
min
variabel ketika Anda mencari nilai minimum.Infinity - 1 === Infinity
1 - Infinity === -Infinity
Jawaban Jimmy benar mewakili spektrum bilangan bulat JavaScript terus menerus sebagai -9007199254740992 ke 9007199254740992 inklusif (maaf 9007199254740993, Anda mungkin berpikir Anda 9007199254740993, tetapi Anda salah! Demonstrasi di bawah atau di jsfiddle ).
Namun, tidak ada jawaban yang menemukan / membuktikan ini secara terprogram (selain yang CoolAJ86 singgung dalam jawabannya yang akan selesai dalam 28,56 tahun;), jadi inilah cara yang sedikit lebih efisien untuk melakukan itu (tepatnya, lebih efisien) sekitar 28,559999999968312 tahun :), bersama dengan biola uji :
sumber
x++
memberi Anda nilai x sebelum kenaikan terjadi, sehingga mungkin menjelaskan perbedaan. Jika Anda ingin ekspresi mengevaluasi ke hal yang sama dengan nilai akhir x, Anda harus mengubahnya menjadi++x
.Supaya aman
Pemikiran
Saya pikir saya akan menjadi pintar dan menemukan nilai di mana
x + 1 === x
dengan pendekatan yang lebih pragmatis.Mesin saya hanya dapat menghitung 10 juta per detik atau lebih ... jadi saya akan mengirim kembali dengan jawaban pasti dalam 28,56 tahun.
Jika Anda tidak bisa menunggu selama itu, saya berani bertaruh itu
9007199254740992 === Math.pow(2, 53) + 1
cukup buktinya4294967295
hal ituMath.pow(2,32) - 1
untuk menghindari masalah yang diharapkan dengan pengalihan bitMenemukan
x + 1 === x
:sumber
Jawaban singkatnya adalah "itu tergantung."
Jika Anda menggunakan operator bitwise di mana saja (atau jika Anda mengacu pada panjang Array), rentangnya adalah:
Tidak ditandatangani:
0…(-1>>>0)
Tertanda:
(-(-1>>>1)-1)…(-1>>>1)
(Kebetulan bahwa operator bitwise dan panjang maksimum array dibatasi untuk bilangan bulat 32-bit.)
Jika Anda tidak menggunakan operator bitwise atau bekerja dengan panjang array:
Tertanda:
(-Math.pow(2,53))…(+Math.pow(2,53))
Batasan ini dikenakan oleh representasi internal dari tipe "Number", yang umumnya sesuai dengan representasi floating-point IEEE 754 presisi ganda. (Perhatikan bahwa tidak seperti bilangan bulat yang ditandatangani, besarnya batas negatif sama dengan besarnya batas positif, karena karakteristik representasi internal, yang sebenarnya termasuk negatif 0!)
sumber
ECMAScript 6:
sumber
MAX_SAFE_INTEGER
di semua browser dengan bekerja mundur? Haruskah Anda maju? Yaitu, Number.MAX_SAFE_INTEGER = 2 * (Math.pow (2, 52) - 1) +1Math.pow(2, 53)-1
operasi yang aman? Ini lebih besar dari integer aman terbesar.Banyak jawaban dari jaman dulu telah menunjukkan hasil
true
dari9007199254740992 === 9007199254740992 + 1
untuk memverifikasi bahwa 9 007 199 254 740 991 adalah maksimum dan integer aman.Bagaimana jika kita terus melakukan akumulasi:
Kita bisa mengetahui bahwa di antara angka-angka yang lebih besar dari 9 007 199 254 740 992 , hanya angka genap yang dapat diwakili .
Ini adalah pintu masuk untuk menjelaskan bagaimana format biner 64-bit presisi ganda bekerja pada ini. Mari kita lihat bagaimana 9 007 199 254 740 992 dipegang (diwakili) dengan menggunakan format biner ini.
Menggunakan versi singkat untuk menunjukkannya dari 4 503 599 627 370 496 :
Di sisi kiri panah, kita memiliki nilai bit 1 , dan titik radix yang berdekatan , kemudian dengan mengalikan
2^52
, kita memindahkan titik radix 52 langkah ke kanan, dan menuju akhir. Sekarang kita mendapatkan 4503599627370496 dalam bentuk biner.Sekarang kita mulai mengakumulasi 1 ke nilai ini sampai semua bit diatur ke 1, yang sama dengan 9 007 199 254 740 991 dalam desimal.
Sekarang, karena dalam format biner 64-bit presisi ganda , ia secara ketat mengalokasikan 52 bit untuk fraksi, tidak ada lagi bit yang tersedia untuk dibawa untuk menambahkan satu lagi 1, jadi yang bisa kita lakukan adalah mengatur semua bit kembali ke 0, dan memanipulasi bagian eksponen:
Sekarang kita mendapatkan 9 007 199 254 740 992 , dan dengan jumlah yang lebih besar dari itu, format apa yang bisa menampung adalah 2 kali dari fraksi , itu berarti sekarang setiap 1 penambahan pada bagian pecahan sebenarnya sama dengan 2 penambahan, itu sebabnya dua kali lipat format 64-bit binary tidak dapat menampung angka ganjil ketika jumlahnya lebih besar dari 9 007 199 254 740 992 :
Jadi ketika jumlahnya mencapai lebih dari 9 007 199 254 740 992 * 2 = 18 014 398 509 481 984, hanya 4 kali fraksi yang dapat disimpan:
Bagaimana dengan angka antara [ 2 251 799 813 685 248 , 4 503 599 627 370 496 )?
Nilai bit 1 setelah titik radix adalah 2 ^ -1 tepatnya. (= 1/2, = 0,5) Jadi ketika angka kurang dari 4 503 599 627 370 496 (2 ^ 52), ada satu bit yang tersedia untuk mewakili 1/2 kali bilangan bulat :
Kurang dari 2 251 799 813 685 248 (2 ^ 51)
Dan apa kisaran eksponen yang tersedia ? format membagikan 11 bit untuk itu. Format lengkap dari Wiki : (Untuk lebih jelasnya silakan ke sana)
Jadi untuk membuat bagian eksponen menjadi 2 ^ 52, kita harus menetapkan e = 1075.
sumber
Yang lain mungkin sudah memberikan jawaban umum, tetapi saya pikir itu akan menjadi ide yang baik untuk memberikan cara cepat untuk menentukannya:
Yang memberi saya 9007199254740992 dalam waktu kurang dari satu milidetik di Chrome 30.
Ini akan menguji kekuatan 2 untuk menemukan yang mana, ketika 'ditambahkan' 1, sama dengan dirinya.
sumber
Apa pun yang ingin Anda gunakan untuk operasi bitwise harus antara 0x80000000 (-2147483648 atau -2 ^ 31) dan 0x7fffffff (2147483647 atau 2 ^ 31 - 1).
Konsol akan memberi tahu Anda bahwa 0x80000000 sama dengan +2147483648, tetapi 0x80000000 & 0x80000000 sama dengan -2147483648.
sumber
Mencoba:
Di Firefox 3.6 itu 2 ^ 31 - 1.
sumber
^
berarti dinaikkan ke kekuasaan . Di konsol javascript,^
adalah XOR , tidak dinaikkan ke101
dan 2 adalah010
. Sekarang, jika Anda Bitwise XOR mereka, Anda akan5(101) ^ 2(010) = 7(111)
MEMBACA INI JIKA ANDA BINGUNG Apa yang dibahas di siniMath.pow()
bukan^
operatorPada saat penulisan, JavaScript menerima tipe data baru:
BigInt
. Ini adalah proposal TC39 pada tahap 4 untuk dimasukkan dalam EcmaScript 2020 .BigInt
tersedia di Chrome 67+, FireFox 68+, Opera 54 dan Node 10.4.0. Ini sedang berlangsung di Safari, dkk ... Ini memperkenalkan literal numerik yang memiliki akhiran "n" dan memungkinkan untuk presisi yang berubah-ubah:Ketepatan masih akan hilang, tentu saja, ketika angka seperti itu (mungkin tidak sengaja) dipaksa ke tipe data nomor.
Dan, jelas, akan selalu ada keterbatasan presisi karena memori yang terbatas, dan biaya dalam hal waktu untuk mengalokasikan memori yang diperlukan dan untuk melakukan aritmatika pada sejumlah besar tersebut.
Misalnya, pembuatan angka dengan seratus ribu digit desimal, akan mengalami penundaan sebelum selesai:
... tapi berhasil.
sumber
Saya melakukan tes sederhana dengan rumus, X- (X + 1) = - 1, dan nilai XI terbesar dapat bekerja di Safari, Opera dan Firefox (diuji pada OS X) adalah 9e15. Berikut adalah kode yang saya gunakan untuk pengujian:
sumber
9000000000000000
ada 1 angka penting. dalam `9007199254740992` ada 15 angka penting.9000000000000000
apa adanya - memiliki1
SF. di mana90*10^14
memiliki 2. ( sigfigscalculator.appspot.com ) & mathsfirst.massey.ac.nz/Algebra/Decimals/SigFig.htm (bagian bawah)Saya menulis seperti ini:
Sama untuk int32
sumber
Mari kita ke sumbernya
Deskripsi
Kompatibilitas browser
sumber
Di javascript bawaan Google Chrome, Anda dapat membuka sekitar 2 ^ 1024 sebelum nomornya disebut tak terhingga.
sumber
Dalam JavaScript, representasi angka adalah
2^53 - 1
.Namun ,
Bitwise operation
dihitung pada32 bits ( 4 bytes )
, artinya jika Anda melebihi 32 bit shift Anda akan mulai kehilangan bit.sumber
Scato wrotes:
Hex-Desimal adalah nilai positif yang tidak ditandatangani, jadi 0x80000000 = 2147483648 - itu benar secara matematis. Jika Anda ingin menjadikannya nilai yang ditandatangani, Anda harus menggeser ke kanan: 0x80000000 >> 0 = -2147483648. Anda juga dapat menulis 1 << 31.
sumber
Firefox 3 tampaknya tidak memiliki masalah dengan jumlah yang besar.
1e + 200 * 1e + 100 akan menghitung denda hingga 1e + 300.
Safari tampaknya tidak punya masalah dengan itu juga. (Sebagai catatan, ini ada di Mac jika orang lain memutuskan untuk menguji ini.)
Kecuali saya kehilangan otak pada saat ini, ini jauh lebih besar dari integer 64-bit.
sumber
100000000000000010 - 1 => 100000000000000020
Node.js dan Google Chrome tampaknya menggunakan nilai titik apung 1024 bit jadi:
sumber
2^53
disebutMAX_SAFE_INT
karena di atas titik itu nilai-nilai menjadi perkiraan, dengan cara yang sama fraksi.