Pertanyaan Meniru presisi tetap dengan python


Untuk kursus universitas dalam analisis numerik, kita beralih dari Maple ke kombinasi Numpy dan Sympy untuk berbagai ilustrasi materi kursus. Ini karena siswa sudah belajar Python semester sebelumnya.

Salah satu kesulitan yang kita miliki adalah dalam meniru presisi tetap dengan Python. Maple memungkinkan pengguna untuk menentukan presisi desimal (katakanlah 10 atau 20 digit) dan sejak saat itu setiap perhitungan dibuat dengan ketepatan itu sehingga Anda dapat melihat efek kesalahan pembulatan. Dengan Python kami mencoba beberapa cara untuk mencapai ini:

  • Sympy memiliki fungsi pembulatan ke sejumlah digit yang ditentukan.
  • Mpmath mendukung presisi khusus.

Namun ini bukan yang kami cari. Opsi-opsi ini menghitung hasil yang tepat dan membulatkan hasil yang tepat ke jumlah digit yang ditentukan. Kami mencari solusi yang melakukan setiap perhitungan menengah dalam ketepatan yang ditentukan. Sesuatu yang dapat menunjukkan, misalnya, kesalahan pembulatan yang dapat terjadi ketika membagi dua angka yang sangat kecil.

Solusi terbaik sejauh ini tampaknya adalah tipe data kustom di Numpy. Menggunakan float16, float32 dan float64 kami mampu setidaknya memberikan indikasi apa yang bisa salah. Masalahnya di sini adalah bahwa kita selalu perlu menggunakan array dari satu elemen dan bahwa kita terbatas pada ketiga tipe data ini.

Apakah ada yang lebih fleksibel untuk tujuan kita? Ataukah hal yang kita cari tersembunyi di suatu tempat dalam dokumentasi mpmath? Tentu saja ada solusi dengan membungkus setiap elemen perhitungan dalam fungsi pembulatan tetapi ini mengaburkan kode ke siswa.


5
2018-01-10 09:25


asal


Jawaban:


Kamu dapat memakai decimal. Ada beberapa cara penggunaan, misalnya, localcontext atau getcontext.

Contoh dengan getcontext dari dokumentasi:

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')

Contoh localcontext pemakaian:

>>> from decimal import Decimal, localcontext
>>> with localcontext() as ctx:
...     ctx.prec = 4
...     print Decimal(1) / Decimal(3)
... 
0.3333

Untuk mengurangi pengetikan, Anda dapat menyingkat konstruktor (contoh dari dokumentasi):

>>> D = decimal.Decimal
>>> D('1.23') + D('3.45')
Decimal('4.68')

3
2018-01-10 09:39