BC — penggandaan presisi penuh otomatis

10

Tinggi, saya perlu menguji kalkulator presisi sewenang-wenang saya, dan bctampaknya seperti tolok ukur yang bagus untuk membandingkan, bagaimanapun, bctidak memotong hasil dari setiap perkalian dengan apa yang tampaknya menjadi skala maksimum dari masing-masing operan yang terlibat.

Apakah ada cara cepat untuk mematikan ini atau secara otomatis mengatur skala setiap perkalian dengan jumlah skala faktor sehingga tidak kehilangan presisi?

Jika Anda memiliki solusi yang lebih elegan untuk ini selain melibatkan sesuatu bc, saya sangat menghargai Anda membagikannya.

Contoh:

$ bc <<< '1.5 * 1.5'
2.2

Jawaban sebenarnya adalah 2,25.

PSkocik
sumber
Terkait dengan operasi Float dengan bc? .
manatwork

Jawaban:

12

Anda dapat mengontrol skala yang bcdihasilkan dengan scale=<#>argumen.

$ echo "scale=10; 5.1234 * 5.5678" | bc
28.52606652

$ echo "scale=5; 5.1234 * 5.5678" | bc
28.52606

Menggunakan contoh Anda:

$ bc <<< 'scale=2; 1.5 * 1.5'
2.25

Anda juga dapat menggunakan -lsakelar (terima kasih ke @manatwork) yang akan menginisialisasi skala ke 20 alih-alih standar 0. Misalnya:

$ bc -l <<< '1.5 * 1.5'
2.25

$ bc -l <<< '1.52 * 1.52'
2.3104

Anda dapat membaca lebih lanjut tentang scaledi bchalaman manual .

slm
sumber
5
Atau lebih pendek: bc -l. " -L (Huruf ell.) Tentukan fungsi matematika dan inisialisasi skala ke 20, bukan nol default" - bcspesifikasi
manatwork
@manatwork - terima kasih, tidak melihat saklar itu.
slm
Terima kasih. Saya kira saya bisa mengatur skala ke 2147483647 (yang kebetulan sama dengan INT_MAX), yang mana bc mengatakan kepada saya adalah nilai skala maksimum yang dapat saya atur (saya sudah sejauh itu dalam tes saya), tapi saya kira saya akan Saya hanya akan mengujinya dengan bilangan bulat dan memberikan bc manfaat kinerja yang berasal dari penggunaan angka panjang dinamis.
PSkocik
1
Untuk perkalian bc, skala hasilnya persis di min(max(sx,sy,scale),sx+sy)mana sxdan syadalah skala dari xdan ydalam x*y. Pengaturan scale=scale(x)+scale(y)akan memberikan presisi maksimum yang dibutuhkan. Mengatur skala ke angka yang lebih tinggi (seperti 1000) tidak akan meningkatkan skala hasilnya. Variabel skala hanya mempengaruhi s secara langsung hasil pembagian scale=1000; a/1akan menghasilkan hasil dengan 1000 digit desimal (setelah titik) tidak peduli apa skala dari sebelumnya.
Isaac
1

Coba ini :

$ bc
scale=10
1.5 * 1.5
2.25

Cari manusia bc untuk variabel skala

DavAlPi
sumber
0

Saya telah membuat fungsi bash ini yang tidak akan menampilkan nol trailing

calc () { MAX_PRECISION=20; bc <<< "scale=$MAX_PRECISION; scale = scale($@); $@"; }

Contoh: calc 1.25^3= 1.953125

Vartan
sumber