17 puan yazan darjeeling 2026-01-25 | Henüz yorum yok. | WhatsApp'ta paylaş

Özet:

  • Russ Cox'un önerdiği yeni kayan nokta dönüşüm algoritması, mevcut karmaşık algoritmalardan (Ryū, Dragonbox vb.) daha basit olmasına rağmen daha yüksek performans sunuyor.
  • Unrounded Scaling adlı temel primitive sayesinde ikilik ve ondalık sistemler arasındaki dönüşümü tek bir 64 bit çarpma düzeyinde hızlandırıyor.
  • Bu uygulamanın Go 1.27'ye (Ağustos 2026 planlanıyor) dahil edilmesi bekleniyor ve hem sabit hassasiyetli çıktı hem de en kısa uzunlukta ayrıştırma/çıktı desteği sunuyor.
  • Mevcut uygulamalara kıyasla performans artışı
  • Yazdırma (Printing) performansı: yaklaşık %10~30 artış
  • Ayrıştırma (Parsing) performansı: yaklaşık %5~15 artış

Ayrıntılı özet:

1. Arka plan: kayan nokta dönüşümünün kronik karmaşıklığı

Bilgisayarların ikilik kayan nokta sayılarını insanların okuyabileceği ondalık sayılara çevirmek ya da tersini yapmak, onlarca yıldır çok sayıda algoritmanın (Dragon4, Grisu3, Ryū, Dragonbox vb.) rekabet ettiği bir alan oldu. Russ Cox geçmişte "dönüştürmek kolay ama sorun hız" demişti; bu yazıda ise "hızlı dönüşüm algoritmaları da basit olabilir" tezini kanıtlıyor.

2. Temel fikir: Unrounded Numbers (⟨x⟩)

Bu algoritmanın temeli unrounded tipidir. Bu tip, sayının yalnızca tam kısmını değil, aynı zamanda yuvarlama için gerekli bilgiyi de koruyan 2 bitlik ek bilgi taşır (½ bit ve onun altındaki bitlerin OR değeri olan sticky bit).

  • Yapı: ⟨x⟩ = ⌊4x⌋ | (4x ≠ ⌊4x⌋)
  • Avantaj: Bu biçim korunduğunda floor, ceil ya da kayan nokta için en önemli işlem olan Round-to-nearest, ties-to-even çok düşük maliyetle uygulanabilir.

3. Hızlı yuvarlanmamış ölçekleme (Fast Unrounded Scaling)

En kritik fonksiyon uscale(x, e, p)'dir. Bu fonksiyon, unrounded sonucunu hesaplar.
Mevcut algoritmalar çok büyük tamsayı işlemleri gerektirirken, bu yaklaşım aşağıdaki ilke sayesinde işlemi 64 bit aritmetik içinde çözer.

// Kavramsal uygulama örneği (gerçek optimize sürüm daha karmaşıktır)  
func uscale(x uint64, e, p int) unrounded {  
    // 10^p değerini 2^k * tam kesir yaklaşımıyla hesapla  
    // Çoğu durumda tek bir 64 bit çarpma (mul64) ve shift işlemlerine indirgenir  
}  
  

4. Başlıca sonuçlar ve performans

  • Basitlik: Uygulama kodu oldukça kısa; bakımı kolay ve mantıksal olarak ispatlanabilir.
  • Performans: Benchmark sonuçlarına göre, bugün en hızlı olduğu kabul edilen Dragonbox (çıktı) ve Eisel-Lemire (ayrıştırma) algoritmalarından daha hızlı çalışıyor.
  • Genellik: Hem sabit genişlikte çıktı (Fixed-width printing) hem de orijinali eksiksiz geri kazandıran en kısa genişlikte çıktı (Shortest-width printing) için kullanılabiliyor.

5. Geliştiriciler için anlamı

Bu algoritmanın Go dilinin standart kütüphanesine entegre edilmesi planlanıyor. Böylece geliştiriciler, dahili olarak ondalık dönüşüm yapılan durumlarda (ör. fmt.Printf("%f", f) veya strconv.ParseFloat) daha az CPU kaynağı kullanarak doğru sonuç alabilecek. Ayrıca karmaşık sayısal analiz kütüphaneleri olmadan da unrounded kavramı üzerinden hassas sayısal kontrol için ilham veriyor.```

Henüz yorum yok.

Henüz yorum yok.