Merhaba,
Bu konuda şurada (http://tr.wikipedia.org/wiki/IEEE_754-2008) bazı bilgiler mevcut. Bir yerde aşağıdaki gibi union ve bir takım işlevler ile karşılaştım. Her ne kadar aynısını D'ye uyarlayamasam da (çünkü union için bir struct var!) yakın bir şeyler yapmaya çalıştım...:)
Alıntı:
> typedef union
> {
> double value;
> struct
> {
> u_int32_t msw;
> u_int32_t lsw;
> } parts;
> } ieee_double_shape_type;
> double fabs(double x)
> {
> u_int32_t high;
> GET_HIGH_WORD(high, x);
> SET_HIGH_WORD(x, high & 0x7fffffff);
> return x;
> }
> ```
>
Burada üst bitleri (MSB) 0x7fffffff ile AND'liyor. Nedenini bilmediğim bir sebepten kısmen doğru çalışıyor ama büyük sayılarda sayı değerini bozuyor. Oysa çift duyarlılıklı (double) sayıları incelediğimizde son biti (soldaki ilk bit) 0 yapmak yetiyor. Bunun için de sırasıyla 1 bit sola ve sağa kaydırmak veya sayıyı 0x7fffffff_ffffffff ile AND'lemek gerekiyor.
Belki bu tür (double) sayılara müdahale etmek isterseniz aşağıdakine benzer bir örnek işinize yarayabilir:
union IEEE754
{
double value;
uint[2] parts;
}
double fabs(double x)
{
auto FP = IEEE754(x);
uint i = FP.parts[1] << 1;
FP.parts[1] = i >> 1;
return FP.value;
}
void main() {
double test = -1234567890.123;
assert(fabs(test) == std.math.fabs(test));
}
Başarılar...
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]