Alıntı (canalpay):
> Bu arada şöyle bir denemem oldu:
Tabii ki çok güzel. Ama... :)
Kesirli sayıların sorunlarını hatırlarsak, 'artış' gibi bir değer tam olarak ifade edilemeyebilir.
Kesirli sayılar sayfasında, 0.1'in tam olarak ifade edilememesiyle ilgili şu örnek vardı:
http://ddili.org/ders/d/kesirli_sayilar.html
import std.stdio;
void main()
{
float sonuç = 0;
// Bu döngünün 1000 kere tekrarlandıktan sonra 1 değerine
// ulaşacağını düşünürüz:
while (sonuç < 1) {
sonuç += 0.001;
}
// Bakalım doğru mu...
if (sonuç == 1) {
writeln("Beklendiği gibi 1");
} else {
writeln("FARKLI: ", sonuç);
}
}
Benzer şekilde, eğer 'artış' tam olarak ifade edilemiyorsa, ondan yola çıkılan değerler de tam ifade edilemiyor olabilirler.
Aslında başından beri sıralama için kesirli sayı kullanmanın doğru olmadığını biliyorum. Zaten o yüzden bilgisayarlarda tam olarak ifade edilebildiği garantili olan 0x0.8p0 küsur değerini kullanıyordum.
O değer, 0.5 değeridir ve tam olarak ifade edilebilir. Onun yarısı olan değerler, ve o değerlerin toplamlarından oluşan değerler de, duyarlık yettiği sürece tam olarak ifade edilebilirler: 0x0.4p0, 0x0.2p0, 0x0.1p0, vs. (veya örneğin bu üçünün toplamı olan 0x0.7p0)
Şu program, bu değerleri daha değişik bir düzende gösteriyor:
import std.cstream;
void main()
{
double başlangıç = 1;
foreach (i; 0 .. 10) {
dout.writefln("%a", başlangıç);
başlangıç /= 2;
}
}
Bendeki çıktısında 1 için '0x8p-3' yazıyor. (O, 8 değerinin 3 kere ikiye bölüneceği anlamına gelir.)
Sonuçta, iki yoldan birisini seçmek gerek:
a) Kesirli sayı kullanılacaksa, tam olarak ifade edilebilen değerler kullanılmalı. (Baştan da dediğim gibi, bunu elle yazabiliriz; ama sıraları otomatik olarak bir programa yaptırmak da ilginç bir problem :) )
b) 64-bit değerler kullanacağız. Bu daha iyi olabilir; çünkü tamsayı işlemleri zaten kesirli sayılardan daha hızlıdır. Bunun için, her Unicode değerini 32 bit sola kaydırabiliriz. Son 32 bit ise yalnızca özel karakterler için, yani bir anlamda küsurat için kullanılır.
Çok kısaca, şu programın ürettiği gibi değerler olabilir:
import std.cstream;
long sıraDeğeri(dchar karakter)
{
return (cast(long)karakter) << 32;
}
void main()
{
long[dchar] sıralar = [ 'ğ' : sıraDeğeri('g') + 1,
'ı' : sıraDeğeri('h') + 1,
];
dstring alfabe = "gğhıi";
foreach (karakter; alfabe) {
auto tablo_değeri = karakter in sıralar;
auto sıra = tablo_değeri ? *tablo_değeri : sıraDeğeri(karakter);
dout.writefln("%s: %#x", karakter, sıra);
}
}
Alıntı:
> imge
Bu arada, alfabe harflerini ve başka karakterleri de ifade etmek içinE "imge" mi daha uygun yoksa "im" mi? Ben de baştan imgeyi düşünmüştüm ama sözlük anlamı olarak im daha yakın geliyor. Ne dersiniz?
Alıntı:
> Bazı yerlerde gereksiz değişken tanımlamamın nedeni, neyin ne olduğunu görmek istememdi.
Ben de öyle yaparım zaten. :) Daha önce gerçekten gereksiz olduğunu düşündüğüm değişkenler için söylediklerim seni caydırmasın.
Alıntı:
> Zaten derleyici bu sorunu en iyileştirme ile halletmiştir değil mi :-)
Doğru.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]