F64 Clamp(F64 d, F64 lo, F64 hi)
{//Clamp to F64 [] range.
        if (d < lo)
                return lo;
        if (d > hi)
                return hi;

        return d;
}

F64 Min(F64 n1, F64 n2)
{//Min of two F64s.
        if (n1 <= n2)
                return n1;
        else
                return n2;
}

F64 Max(F64 n1, F64 n2)
{//Max of two F64s.
        if (n1 >= n2)
                return n1;
        else
                return n2;
}

F64 Pow10I64(I64 i)
{//F64 int powers of ten.
        if (i > 308)
                return inf;
        else if (i < -308)
                return 0.0;
        else
                return pow10_I64[i + 309];
}

U64 FloorU64(U64 num, U64 to)
{//Int multiples of num.
        return num - num % to;
}

U64 CeilU64(U64 num, U64 to)
{//Int multiples of num.
        num += to - 1;

        return num - num % to;
}

I64 RoundI64(I64 num, I64 to)
{//Int multiples of num.
        return num - num % to;
}

I64 FloorI64(I64 num, I64 to)
{//Int multiples of num.
        if (num >= 0)
                return num - num % to;
        else
        {
                num++;
                return num - num % to - to;
        }
}

I64 CeilI64(I64 num, I64 to)
{//Int multiples of num.
        if (num >= 0)
        {
                num += to - 1;
                return num - num % to;
        }
        else
        {
                num += to - 1;
                return num - num % to - to;
        }
}

//See ::/Doc/Credits.DD.
#define LIN_CONGRUE_A   6364136223846793005
#define LIN_CONGRUE_C   1442695040888963407

I64 RandInt()
{//Don't use this. Use the functions below.
        I64 res = Fs->rand_seed;

        res = LIN_CONGRUE_A * res ^ (res & 0xFFFFFFFF0000) >> 16 + LIN_CONGRUE_C;
        if (!Bt(&Fs->task_flags, TASKf_NONTIMER_RAND))
                res ^= TSCGet;
        Fs->rand_seed = res;

        return res;
}

U8 RandU8()
{//Random U8.
        return RandInt & U8_MAX;
}

I16 RandI16()
{//Random I16.
        I64 res = RandInt;

        return res.i16[0];
}

U16 RandU16()
{//Random U16.
        return RandInt & U16_MAX;
}

I32 RandI32()
{//Random I32.
        I64 res = RandInt;

        return res.i32[0];
}

U32 RandU32()
{//Random U32.
        return RandInt & U32_MAX;
}

I64 RandI64()
{//Random I64.
        return RandInt;
}

U64 RandU64()
{//Random U64.
        return RandInt;
}

F64 Rand()
{//Random F64.
        return (RandInt & 0x3FFFFFFFFFFFFFFF) / ToF64(0x4000000000000000);
}

I64 Seed(I64 seed=0, CTask *task=NULL)
{//Set Rand() seed. Zero for timer-based.
        if (!task)
                task = Fs;
        if (seed)
        {
                LBts(&task->task_flags, TASKf_NONTIMER_RAND);
                return task->rand_seed = seed;
        }
        else
        {
                LBtr(&task->task_flags, TASKf_NONTIMER_RAND);
                return task->rand_seed ^= TSCGet;
        }
}