17 poin oleh darjeeling 2026-01-25 | Belum ada komentar. | Bagikan ke WhatsApp

Ringkasan:

  • Algoritma konversi floating-point baru yang diusulkan Russ Cox lebih sederhana namun berkinerja lebih baik dibanding algoritma lama yang kompleks (Ryū, Dragonbox, dll.).
  • Melalui primitif inti bernama Unrounded Scaling, konversi antara biner dan desimal dipercepat hingga setara satu kali perkalian 64-bit.
  • Implementasi ini diperkirakan akan disertakan dalam Go 1.27 (direncanakan pada Agustus 2026), serta mendukung output presisi tetap dan parsing/output jarak terpendek.
  • Peningkatan performa dibanding implementasi sebelumnya
  • Performa output (Printing): meningkat sekitar 10~30%
  • Performa parsing (Parsing): meningkat sekitar 5~15%

Ringkasan detail:

1. Latar belakang: kompleksitas kronis konversi floating-point

Mengubah floating-point biner komputer menjadi desimal yang bisa dibaca manusia, atau sebaliknya, adalah bidang yang selama puluhan tahun diwarnai persaingan banyak algoritma (Dragon4, Grisu3, Ryū, Dragonbox, dll.). Russ Cox sebelumnya pernah mengatakan bahwa "konversi itu mudah, masalahnya ada pada kecepatannya", tetapi melalui postingan ini ia membuktikan bahwa "algoritma konversi cepat juga bisa sederhana".

2. Konsep inti: Unrounded Numbers (⟨x⟩)

Dasar algoritma ini adalah tipe unrounded. Tipe ini mempertahankan bukan hanya bagian bilangan bulat dari suatu angka, tetapi juga 2 bit informasi tambahan yang diperlukan untuk pembulatan (bit ½ dan nilai OR dari bit-bit di bawahnya, yaitu 'sticky bit').

  • Struktur: ⟨x⟩ = ⌊4x⌋ | (4x ≠ ⌊4x⌋)
  • Keunggulan: Dengan mempertahankan bentuk ini, operasi floor, ceil, maupun operasi yang paling penting dalam floating-point yaitu 'Round-to-nearest, ties-to-even' dapat dilakukan dengan biaya yang sangat rendah.

3. Penskalaan tak-dibulatkan berkecepatan tinggi (Fast Unrounded Scaling)

Fungsi paling inti adalah uscale(x, e, p). Fungsi ini menghitung hasil unrounded.
Algoritma lama membutuhkan operasi bilangan bulat yang sangat besar, tetapi pendekatan ini menanganinya dalam operasi 64-bit dengan prinsip berikut.

// Contoh implementasi konseptual (versi optimal sebenarnya lebih kompleks)  
func uscale(x uint64, e, p int) unrounded {  
    // Menghitung 10^p dengan mendekatinya sebagai 2^k * pecahan eksak  
    // Dalam kebanyakan kasus bermuara pada satu perkalian 64-bit (mul64) dan operasi shift  
}  
  

4. Hasil utama dan performa

  • Kesederhanaan: Kode implementasinya sangat pendek sehingga mudah dipelihara dan bisa dibuktikan secara logis.
  • Performa: Hasil benchmark menunjukkan performa yang lebih cepat dibanding Dragonbox (output) dan Eisel-Lemire (parsing), yang saat ini dikenal sebagai algoritma tercepat.
  • Generalisasi: Berlaku baik untuk output fixed-point (Fixed-width printing) maupun output jarak terpendek yang memulihkan nilai asli secara sempurna (Shortest-width printing).

5. Maknanya bagi developer

Algoritma ini dijadwalkan akan diintegrasikan ke standard library Go. Saat konversi desimal terjadi di balik layar (misalnya fmt.Printf("%f", f) atau strconv.ParseFloat), developer akan memperoleh hasil yang akurat sambil menggunakan sumber daya CPU yang lebih sedikit. Selain itu, konsep unrounded juga memberi inspirasi untuk kontrol numerik yang presisi tanpa perlu library analisis numerik yang rumit.```

Belum ada komentar.

Belum ada komentar.