mirror of https://github.com/minexew/Shrine.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
3.0 KiB
157 lines
3.0 KiB
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 ì; |
|
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 $LK,"::/Doc/Credits.DD"$. |
|
#define LIN_CONGRUE_A 6364136223846793005 |
|
#define LIN_CONGRUE_C 1442695040888963407 |
|
|
|
I16 RandI16() |
|
{//Random I16. |
|
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^=GetTSC; |
|
Fs->rand_seed=res; |
|
return res.i16[0]; |
|
} |
|
|
|
U16 RandU16() |
|
{//Random U16. |
|
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^=GetTSC; |
|
Fs->rand_seed=res; |
|
return res.u16[0]; |
|
} |
|
|
|
I32 RandI32() |
|
{//Random I32. |
|
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^=GetTSC; |
|
Fs->rand_seed=res; |
|
return res.i32[0]; |
|
} |
|
|
|
U32 RandU32() |
|
{//Random U32. |
|
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^=GetTSC; |
|
Fs->rand_seed=res; |
|
return res.u32[0]; |
|
} |
|
|
|
I64 RandI64() |
|
{//Random I64. |
|
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^=GetTSC; |
|
Fs->rand_seed=res; |
|
return res; |
|
} |
|
|
|
U64 RandU64() |
|
{//Random U64. |
|
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^=GetTSC; |
|
Fs->rand_seed=res; |
|
return res; |
|
} |
|
|
|
F64 Rand() |
|
{//Random F64. |
|
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^=GetTSC; |
|
Fs->rand_seed=res; |
|
return (res&0x3FFFFFFFFFFFFFFF)/ToF64(0x4000000000000000); |
|
} |
|
|
|
I64 Seed(I64 seed=0,CTask *task=NULL) |
|
{//Set $LK,"Rand",A="MN: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^=GetTSC; |
|
} |
|
}
|
|
|