Sorunu, typeof() ile incelediğimde std.math içindeki mutlak işlevinin kendisinden küçük türlerde int döndürmeye zorladığını, büyüklerde ise aynı türü yansıttığını ama hatalı hesapladığını gördüm:
ushort ile denenmiş bir çıktı:
abs() type: int, Value: 2
mut() Type: uint, Value: 4294967294
Sorunun neden kaynaklandığına emin olamadım; ta ki kendi yazdığım işlev ile C'dekini karşılaştırana dek! Eğer aşağıdaki yazdığım kodun 2. satırını // ile gizlerseniz (toggle marking) sorunun C'de var olmadığını görürsünüz.
import std.stdio;
import std.math;/*
import core.stdc.stdlib : abs;//*/
uint mut(int x)
{
return (x>0?x:(x|typeof(x).max)-(x-1));
}
ulong mut(long x)
{
return (x>0?x:(x|typeof(x).max)-(x-1));
}
void main()
{
uint[] sub = [ 346367643, 54374255 ];
// s = 291.993.388
auto s1 = abs(sub[1] - sub[0]);
auto s2 = mut(sub[1] - sub[0]);
writefln("abs() type: %s, Value: %d",
typeof(s1).stringof, s1);
writefln("mut() Type: %s, Value: %d",
typeof(s2).stringof, s2);
}/* Output:
abs() type: uint, Value: 4002973908
mut() Type: uint, Value: 291993388
*/
Özetle, D'deki abs() iyi çalışmıyor ama long türü için de C kütüphanesindeki sanırım desteklemiyor. Benim yazdığım mut() ise D'nin eksiğini kapıyor (öyleyse bu bir bug!) ama byte ve short ile çalıştıramadım! :rolleyes:
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]