Ada opsi di R untuk mengontrol tampilan digit. Sebagai contoh:
options(digits=10)
seharusnya memberikan hasil kalkulasi dalam 10 digit hingga akhir sesi R. Di file bantuan R, definisi parameter digit adalah sebagai berikut:
digit: mengontrol jumlah digit yang akan dicetak saat mencetak nilai numerik. Ini hanya saran. Nilai yang valid adalah 1 ... 22 dengan default 7
Jadi, dikatakan ini hanya saran. Bagaimana jika saya ingin selalu menampilkan 10 digit, tidak lebih atau kurang?
Pertanyaan kedua saya adalah, bagaimana jika saya ingin menampilkan lebih dari 22 digit, yaitu untuk kalkulasi yang lebih tepat seperti 100 digit? Apakah mungkin dengan basis R, atau apakah saya memerlukan paket / fungsi tambahan untuk itu?
Edit: Terima kasih atas saran jmoy, saya mencoba sprintf("%.100f",pi)
dan itu memberi
[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"
yang memiliki 48 desimal. Apakah ini batas maksimum yang bisa ditangani R?
python -c "import math; print(format(math.pi, '.100f'))"
. Hasilnya adalahpi
dengan 48 desimal "nyata", diisi dengan nol untuk sisa 52 digit.Jawaban:
Alasan ini hanya saran adalah Anda dapat dengan mudah menulis fungsi cetak yang mengabaikan nilai opsi. Fungsi pencetakan dan pemformatan
options
bawaan menggunakan nilai sebagai default.Mengenai pertanyaan kedua, karena R menggunakan aritmatika presisi hingga, jawaban Anda tidak akurat melebihi 15 atau 16 tempat desimal, jadi secara umum, lebih banyak tidak diperlukan. The GMP dan RCDD paket berurusan dengan beberapa presisi aritmatika (melalui interace ke perpustakaan GMP), tapi ini sebagian besar terkait dengan bilangan bulat besar daripada tempat desimal lebih untuk ganda Anda.
Mathematica atau Maple akan memungkinkan Anda memberikan tempat desimal sebanyak yang diinginkan hati Anda.
EDIT:
Mungkin berguna untuk memikirkan perbedaan antara tempat desimal dan angka penting. Jika Anda melakukan uji statistik yang mengandalkan perbedaan di luar angka signifikan ke-15, maka analisis Anda hampir pasti sampah.
Di sisi lain, jika Anda hanya berurusan dengan angka yang sangat kecil, itu bukan masalah, karena R dapat menangani angka sekecil
.Machine$double.xmin
(biasanya 2e-308).Bandingkan kedua analisis ini.
Dalam kasus pertama, perbedaan antara angka hanya terjadi setelah banyak angka penting, sehingga datanya "hampir konstan". Dalam kasus kedua, Meskipun ukuran perbedaan antara bilangan sama, dibandingkan dengan besarnya bilangan itu sendiri, mereka besar.
Seperti yang disebutkan oleh e3bo, Anda dapat menggunakan bilangan floating point presisi ganda menggunakan
Rmpfr
paket.Ini lebih lambat dan lebih banyak menggunakan memori daripada
numeric
vektor biasa (presisi ganda) , tetapi dapat berguna jika Anda memiliki masalah yang dikondisikan dengan buruk atau algoritme yang tidak stabil.sumber
Jika Anda memproduksi sendiri seluruh output, Anda dapat menggunakan
sprintf()
, misMenentukan yang ingin Anda format nomor floating point dengan poin desimal sepuluh (di
%.10f
dalamf
adalah untuk float dan.10
menspesifikasikan sepuluh poin desimal).Saya tidak tahu cara apa pun untuk memaksa fungsi level R yang lebih tinggi untuk mencetak jumlah digit yang tepat.
Menampilkan 100 digit tidak masuk akal jika Anda mencetak angka biasa R, karena akurasi terbaik yang dapat Anda peroleh menggunakan penggandaan 64-bit adalah sekitar 16 digit desimal (lihat .Machine $ double.eps pada sistem Anda). Digit yang tersisa hanya akan menjadi sampah.
sumber
Satu lagi solusi yang dapat mengontrol berapa banyak angka desimal yang akan dicetak berdasarkan kebutuhan (jika Anda tidak ingin mencetak nol yang berlebihan)
Misalnya, jika Anda memiliki vektor sebagai
elements
dan ingin mendapatkansum
ituRupanya, digital terakhir yang
1
telah dipotong, hasil yang ideal seharusnya-876.54321
, tetapi jika ditetapkan sebagai opsi desimal pencetakan tetap, misalnyasprintf("%.10f", sum(elements))
, nol yang berlebihan menghasilkan sebagai-876.5432100000
Berikut tutorialnya disini: mencetak bilangan desimal , jika mampu mengidentifikasi berapa digit desimal pada bilangan tertentu tersebut, seperti disini
-876.54321
ada 5 digit desimal yang perlu dicetak, maka kita dapat mengatur parameter untukformat
fungsinya seperti dibawah ini:Kami dapat mengubah
decimal_length
berdasarkan setiap kueri waktu, sehingga dapat memenuhi persyaratan pencetakan desimal yang berbeda.sumber