1 poin oleh GN⁺ 3 hari lalu | 1 komentar | Bagikan ke WhatsApp
  • Menerima gabungan interval terpisah sebagai input, lalu dapat menjalankan empat operasi aritmetika dasar, pemanggilan fungsi, hingga perpangkatan, sehingga interval union arithmetic bisa dihitung langsung di browser
  • Interval hasil pasti mencakup nilai yang diperoleh saat ekspresi yang sama dihitung di bilangan real menggunakan nilai-nilai yang dipilih dari gabungan input, dan pembagian dengan interval yang mencakup 0 juga dapat ditangani dalam bentuk gabungan terpisah
  • Pada 1 / [-2, 1] hasilnya [-∞, -0.5] U [1, +∞], dan pada tan([pi/3, 2*pi/3]) hasilnya [-∞, -1.732] U [1.732, +∞], sehingga mendukung hasil interval tak-kontinu serta representasi batas tak hingga
  • Mendukung beragam notasi dan fungsi seperti [a, b], [a, b] U [c, d], sintaks interval bertingkat, lo, hi, hull, log10, cos, min, dan max
  • Dalam mode presisi penuh, kalkulator mengembalikan interval yang membungkus nilai aktual dengan pembulatan ke luar berbasis IEEE 754 double precision; contohnya 0.1 + 0.2 ditampilkan sebagai [0.29999999999999993, 0.3000000000000001]

Ikhtisar

  • Ini adalah kalkulator yang menghitung pada gabungan interval terpisah, dan mendukung implementasi interval union arithmetic selain bilangan real biasa
    • Interval [a, b] berarti semua bilangan dari a sampai b, dan [a, b] U [c, d] berarti gabungan dari interval-interval yang saling terpisah
    • Ini merupakan bentuk perluasan dari aritmetika interval biasa, dan bahkan pembagian dengan interval yang mencakup 0 tetap dapat dihitung sambil mempertahankan sifat tertutup
  • Menjamin sifat ketercakupan
    • Jika dari masing-masing gabungan input dipilih satu bilangan real sembarang lalu ekspresi yang sama dihitung di bilangan real, maka hasilnya dijamin termasuk dalam gabungan output
  • Dapat merepresentasikan ketidakpastian
    • Disediakan contoh hasil 50 * (10 + [-1, 1]) menjadi [450, 550]
  • Mendukung perhitungan ekspresi interval yang kompleks
    • Dengan operator U, pengguna dapat memasukkan ekspresi seperti ( [5, 10] U [15, 16] ) / [10, 100]
    • Disediakan contoh hasil [0.05, 1.6]
  • Hasil operasi dapat berupa gabungan terpisah
    • 1 / [-2, 1] menghasilkan [-∞, -0.5] U [1, +∞]
    • tan([pi/3, 2*pi/3]) menghasilkan [-∞, -1.732] U [1.732, +∞]
  • Dalam mode presisi penuh, kalkulator ini dapat dipakai seperti kalkulator biasa sambil tetap memberikan hasil interval yang membungkus nilai aktual, termasuk masalah presisi floating-point
    • Contoh hasil 0.1 + 0.2 ditunjukkan sebagai [0.29999999999999993, 0.3000000000000001]

Sintaks

  • Mendukung notasi dasar
    • Mendukung notasi interval [a, b]
    • Contoh [0.5, 0.6]
  • Mendukung notasi gabungan
    • Mendukung bentuk [a, b] U [c, d]
    • Contoh [0, 1] U [5, 6]
  • Mendukung empat operasi aritmetika dasar dan perpangkatan
    • Penjumlahan A + B contoh ➤ [90, 100] + [-2, 2] hasil [88, 102]
    • Pengurangan A - B contoh ➤ [14, 16] - [8, 12] hasil [2, 8]
    • Perkalian A * B contoh ➤ [-5, 10] * [2, 4] hasil [-20, 40]
    • Pembagian A / B contoh ➤ [2, 4] / [-1, 2] hasil [-∞, -2] U [1, +∞]
    • Perpangkatan A ^ B contoh ➤ [2, 3] ^ [-2, 3] hasil [0.1111, 27]
  • Mendukung fungsi dan konstanta
    • Mendukung pemanggilan fungsi dalam bentuk function(...)
    • log10([1, 10000]) menghasilkan [0, 4]
    • Mendukung input nama konstanta
    • pi menghasilkan [3.1415926535897927, 3.1415926535897936]
  • Dapat mencampur angka dan interval dalam input
    • Interval dapat dimasukkan dengan sintaks kurung siku seperti [1, 2]
    • Angka seperti 3.14 ditafsirkan sebagai interval sempit dengan lebar 0, yaitu [3.14, 3.14]
    • Dalam mode presisi penuh ada perbedaan detail terkait hal ini
    • 1.55 + [-0.002, 0.002] menghasilkan [1.548, 1.552]
  • Mendukung sintaks interval bertingkat
    • Input seperti [0, [0, 100]] dimungkinkan dan menghasilkan [0, 100]
    • Bahkan angka-angka internal yang mendefinisikan batas interval juga ditafsirkan sebagai interval
    • Dalam interval bertingkat, interval yang ditempatkan pada posisi batas akan diambil batas atasnya
    • Desain ini memungkinkan aritmetika diterapkan pada batas itu sendiri
    • [0, cos(2*pi)] menghasilkan [0, 1]

Fungsi yang Didukung

  • Mendukung konstanta
    • Mendukung inf, , pi, e
    • [-inf, 0] * [-inf, 0] menghasilkan [0, +∞]
  • Mendukung fungsi ekstraksi batas
    • lo(A) mengembalikan batas bawah
      • lo([1, 2]) menghasilkan [1, 1]
    • hi(A) mengembalikan batas atas
      • hi([1, 2]) menghasilkan [2, 2]
  • Mendukung perhitungan selubung interval
    • hull(A) membungkus gabungan menjadi satu interval
    • hull([1, 2] U [99, 100]) menghasilkan [1, 100]
  • Mendukung fungsi matematika dasar
    • abs(A) contoh abs([-10, 5]) hasil [0, 10]
    • sqrt(A) contoh sqrt([9, 49]) hasil [3, 7]
    • sqinv(A) contoh sqinv([4, 64]) hasil [-8, -2] U [2, 8]
  • Mendukung fungsi logaritma dan eksponensial
    • log(A) contoh log([0, 1]) hasil [-∞, 0]
    • log2(A) contoh log2([64, 1024]) hasil [6, 10]
    • log10(A) contoh log10([0.0001, 1]) hasil [-4, 0]
    • exp(A) contoh exp([-∞, 0] U [1, 2]) hasil [0, 1] U [2.718, 7.389]
  • Mendukung fungsi trigonometri dan invers trigonometri
    • cos(A) contoh cos([pi/3, pi]) hasil [-1, 0.5]
    • sin(A) contoh sin([pi/6, 5*pi/6]) hasil [0.5, 1]
    • tan(A) contoh tan([pi/3, 2*pi/3]) hasil [-∞, -1.732] U [1.732, +∞]
    • acos(A) contoh acos([-1/2, 1/2]) hasil [1.047, 2.094]
    • asin(A) contoh asin([0, 1]) hasil [0, 1.571]
    • atan(A) contoh atan([-10, 2]) hasil [-1.471, 1.107]
  • Mendukung fungsi nilai minimum dan maksimum
    • min(A, B) contoh min([1, 2], [0, 6]) hasil [0, 2]
    • max(A, B) contoh max([0, 10], [5, 6]) hasil [5, 10]

Mode Presisi Penuh

  • Mengimplementasikan pembulatan ke luar di atas floating-point IEEE 754 double precision
    • Menggunakan tipe number JavaScript
    • Dijamin bahwa interval hasil selalu mencakup nilai aktual jika ekspresi yang sama dihitung pada bilangan real dengan presisi tak terbatas
  • Mencakup kasus 0.1 + 0.2
    • 0.3 tidak dapat direpresentasikan secara tepat dalam floating-point double precision
    • interval arithmetic melakukan perhitungan interval yang mencakup 0.3
  • Perilaku saat mode presisi penuh aktif
    • Angka yang dimasukkan pengguna ditafsirkan sebagai interval terkecil yang mencakup nilai IEEE 754 terdekat dengan representasi desimal yang dimasukkan, tetapi dengan kedua batas tidak sama dengan nilai tersebut
    • Angka keluaran ditampilkan dengan semua digit desimal yang tersedia
    • Menggunakan Number.toString()
  • Perilaku saat mode presisi penuh nonaktif
    • Angka yang dimasukkan pengguna ditafsirkan sebagai interval degenerat yang kedua batasnya sama dengan nilai IEEE 754 terdekat dari representasi desimal yang dimasukkan
    • Angka keluaran ditampilkan hingga 4 digit di belakang koma
    • Menggunakan Number.toPrecision()

Bug

  • Disebutkan bahwa kalkulator ini masih mungkin memiliki bug
  • Tautan issue GitHub disediakan sebagai jalur pelaporan masalah

Open Source

  • Interval Calculator dan mesin kalkulator not-so-float sama-sama dirilis sebagai open source
  • Termasuk tautan dukungan GitHub Sponsors

Rencana Mendatang

  • Mode presisi penuh akan dipisah menjadi dua kontrol
    • interpretasi input
    • presisi tampilan
  • Variabel ans akan ditambahkan
    • variabel untuk menyimpan hasil input sebelumnya
  • Operator atau fungsi irisan akan ditambahkan
  • Intuitivitas prioritas operator U akan diperbaiki
  • Input gabungan kosong akan didukung

1 komentar

 
GN⁺ 3 hari lalu
Komentar Hacker News
  • Sebagai penulisnya, menurut saya pembulatan ke luar memang hal yang paling terkenal dalam interval arithmetic untuk menangani masalah presisi, tapi sayang kalau perhatian hanya tertuju ke sana. Sifat inklusi yang dibahas di makalah penelitian bekerja di semua skala, sehingga hasil seperti 50 * (10 + [-1, 1]) = [450, 550] terasa alami. Jika ditambah lapisan union di atasnya, hal-hal seperti invers sejati dari fungsi kuadrat juga bisa ditangani, dan rasanya akan langsung terasa kalau mencoba sqinv(64) alih-alih sqrt. Sebenarnya interval calculator ini dibuat untuk menguji implementasi interval union arithmetic yang sedang saya kerjakan untuk proyek lain, yaitu backwards updating spreadsheet. Implementasinya ada di not-so-float, dan proyek terkaitnya adalah bidicalc serta diskusi HN
    • Saya penasaran bagaimana arithmetic yang diimplementasikan ini berbeda dari standar IEEE 1788. Saya juga ingin tahu hubungan dua makalah yang ditautkan itu dengan standar tersebut. Apakah untuk menyelesaikan masalah yang disebut di tulisan ini memang harus mulai dari nol, atau sebenarnya bisa dibangun di atas standar IEEE?
    • Ini sangat keren dan saya berniat memainkannya lebih jauh. Ada dua hal yang terutama membuat saya penasaran. Pertama, seberapa sulit menambahkan fungsi multivalued. Misalnya, akan sangat bagus kalau dari asin(1) kita bisa mendapatkan seluruh himpunan [pi/2, pi/2] + n[2pi, 2pi] tanpa perlu Mathematica. Kedua, kalimat penjelasan tentang cara menafsirkan angka input pengguna agak membingungkan. Menurut saya, nilai batas output dari interval terkecil yang memuat nilai input seharusnya adalah dua bilangan IEEE 754 terdekat yang mengapit nilai input itu, tetapi dari kalimat yang sekarang saya malah membacanya seperti IEEE754(input)+[-epsilon, epsilon], jadi maknanya terasa berbeda
  • Ini sangat bagus. Pekerjaan Matt Keeter tentang implicit surfaces dan optimisasi dengan interval math juga menarik untuk dilihat. Hal itu bisa dicek di presentasi ini
  • Saya juga punya kalkulator grafik yang dibuat dengan interval arithmetic, jadi mungkin ini relevan. Ada formulagraph yang bisa langsung dicoba, dan penjelasan cara kerjanya beserta kode terkait ada di tulisan ini
    • Kesan pertama saya terasa mirip GrafEq. Jadi teringat GrafEq yang lama
  • Saya juga pernah merasa ini menarik dan mencoba menulis pustaka sederhana Math::Interval di Raku. Itu raku-Math-Interval, sebuah eksperimen yang dibangun di atas Junction bawaan Raku dan kelas Range, dan itu pengalaman yang cukup menarik
  • Sangat bagus, dan terima kasih sudah membagikannya. Saya rasa akan lebih baik jika interval juga menampilkan apakah batas atas dan bawahnya inklusif. Notasi yang biasa saya pakai adalah tanda kurung yang mengarah ke luar saat nilainya tidak termasuk, dan itu selalu diterapkan juga untuk tak hingga. Misalnya ]-∞, -1] U [0.5, +∞[ seperti ini, dan interval yang dikecualikan di tengah menjadi ]-1, 0.5[. Kalau saya memahaminya dengan benar, min dan max sepertinya juga ditafsirkan dengan cara seperti ini. Dan mungkin akan nyaman juga kalau ada ide UI di mana rumus pada area hasil bisa diklik atau diketuk untuk disalin ke kolom input
    • Setelah membaca makalah yang ditautkan, tampaknya yang dijelaskan di sini hanya interval tertutup. Interval union didefinisikan sebagai himpunan interval tertutup yang saling terpisah, dan hanya batas dari extreme interval di kedua ujung yang boleh menjadi ±∞
    • Mendukung notasi seperti itu mungkin saja, tetapi kodenya akan menjadi jauh lebih rumit. Karena itu saya memutuskan cukup awal untuk tidak mendukungnya. Meski begitu, itu tetap bisa menjadi fitur tambahan yang keren
    • Saya juga agak bingung di bagian itu. Notasi standar yang saya kenal adalah tanda kurung bulat, tapi mungkin memang kurang cocok di lingkungan ASCII
  • Sangat keren. Saya tidak sepenuhnya memahami semua operasinya, tetapi dari bagian yang saya pahami saja sudah cukup mengesankan. Saya merasa seandainya saya diperkenalkan pada aritmetika atas interval sedikit lebih awal di kelas. Konsep serupa sebenarnya sudah muncul, seperti confidence interval di statistika dasar atau tanda ± pada persamaan kuadrat, tetapi saya selalu merasa agak disayangkan bahwa hasil-hasil itu tidak bisa diteruskan perhitungannya sebagai satu data utuh dan malah harus menangani dua nilai ± itu secara terpisah setiap kali. Tentu saya paham guru biasanya ingin cepat kembali ke penerapan sehingga tidak mendalaminya. Tapi setidaknya akan bagus kalau ada petunjuk bahwa objek seperti ini juga bisa memiliki aritmetika umum. Yang ditunjukkan di sini jelas jauh melampaui itu, tetapi sudut pandang melihat interval sebagai data dengan perilakunya sendiri terasa seperti sebuah validasi bahwa pendekatan itu masuk akal
  • Saya merasa akan sangat terbantu kalau dulu saya sudah tahu interval arithmetic saat pertama kali memakai pustaka interval waktu tick di Clojure. Pustaka ini juga menyertakan implementasi Allen's Interval Algebra, dan mengadopsi konsep himpunan interval diskret yang berguna untuk perhitungan praktis. Misalnya cocok untuk pekerjaan HR seperti menghitung himpunan interval cuti yang termasuk dalam suatu tahun tertentu. Saya tadinya hanya tahu pekerjaan Allen, lalu tanpa sengaja menemukan manfaat dari himpunan seperti ini. Kodenya ada di juxt/tick
  • Kegunaan alat ini cukup jelas, tetapi secara pribadi saya merasa kalkulator probabilistik akan lebih berguna. Misalnya hasil seperti 1 / [-1, 2] tidak memberi tahu seberapa masuk akal tiap nilai, dan bahkan kalau diasumsikan inputnya uniform, outputnya jelas tampaknya bukan distribusi uniform
  • Saya juga baru-baru ini mengimplementasikan sesuatu yang mirip, tetapi sudut pandangnya ke arah keanggotaan himpunan. Karena itu, untuk melakukan analisis Boolean penuh atas interval membership, saya membutuhkan operasi komplemen. Semua interval di sini adalah himpunan tertutup, jadi komplemennya menjadi interval terbuka, tetapi untuk kebutuhan saya apakah endpoint termasuk atau tidak tidak terlalu penting, jadi saya tidak benar-benar membedakan interval terbuka dan tertutup. Lagi pula, dalam arithmetic yang tidak presisi, apakah suatu himpunan terbuka atau tertutup pun mungkin tidak terdefinisi dengan baik
  • Perluasan logika ke union of intervals terlihat keren, tetapi saya penasaran soal kompleksitas. Jika satu operasi bisa menghasilkan dua interval, maka setelah N operasi tampaknya dalam beberapa kasus bisa terjadi pertumbuhan eksponensial. Kalau begitu, untuk penggunaan umum seperti abstract interpretation mungkin ini jadi tidak realistis kecuali setelah jumlah tertentu mulai diperkenalkan pendekatan aproksimasi
    • Itu poin yang tepat, dan masalah seperti ini memang sudah dikenal baik di ranah abstract interpretation. Seperti yang Anda katakan, biasanya ukuran objek diberi cap, lalu ketika melewati batas interval-intervalnya digabungkan. Namun setidaknya dalam abstract interpretation, tampaknya cukup umum juga untuk memakai domain yang lebih presisi daripada interval