#pragma once
+ #include "lib/float.qh"
+
void mean_accumulate(entity e, .float a, .float c, float mean, float value, float weight)
{
if (weight == 0) return;
- if (mean == 0) e.(a) *= pow(value, weight);
- else e.(a) += pow(value, mean) * weight;
+ if (mean == 0) e.(a) *= (value ** weight);
+ else e.(a) += (value ** mean) * weight;
e.(c) += weight;
}
float mean_evaluate(entity e, .float a, .float c, float mean)
{
if (e.(c) == 0) return 0;
- if (mean == 0) return pow(e.(a), 1.0 / e.(c));
- else return pow(e.(a) / e.(c), 1.0 / mean);
+ if (mean == 0) return (e.(a) ** (1.0 / e.(c)));
+ else return ((e.(a) / e.(c)) ** (1.0 / mean));
}
#define MEAN_ACCUMULATE(s, prefix, v, w) mean_accumulate(s, prefix##_accumulator, prefix##_count, prefix##_mean, v, w)
return vret;
}
+float lerpratio(float f0, float f1, float ratio) { return f0 * (1 - ratio) + f1 * ratio; }
+
+float lerp(float t0, float f0, float t1, float f1, float t) { return lerpratio(f0, f1, (t - t0) / (t1 - t0)); }
+
+float lerp3ratio(float f0, float f1, float f2, float ratio)
+{
+ int mid = 0.5;
+ return ratio < mid ? lerpratio(f0, f1, ratio / mid) : ratio > mid ? lerpratio(f1, f2, (ratio - mid) / mid) : f1;
+}
+
+vector lerpvratio(vector f0, vector f1, float ratio) { return f0 * (1 - ratio) + f1 * ratio; }
+
+vector lerpv3ratio(vector f0, vector f1, vector f2, float ratio)
+{
+ int mid = 0.5;
+ return ratio < mid ? lerpvratio(f0, f1, ratio / mid) : ratio > mid ? lerpvratio(f1, f2, (ratio - mid) / mid) : f1;
+}
+
vector lerpv(float t0, vector v0, float t1, vector v1, float t)
{
return v0 + (v1 - v0) * ((t - t0) / (t1 - t0));
return a - b < eps && b - a < eps;
}
+ float almost_equals_eps(float a, float b, float times_eps)
+ {
+ float eps = max(fabs(a), fabs(b)) * FLOAT_EPSILON * times_eps;
+ return a - b < eps && b - a < eps;
+ }
+
float almost_in_bounds(float a, float b, float c)
{
float eps = (max(a, -a) + max(c, -c)) * 0.001;
float ExponentialFalloff(float mindist, float maxdist, float halflifedist, float d)
{
- if (halflifedist > 0) return pow(0.5, (bound(mindist, d, maxdist) - mindist) / halflifedist);
- else if (halflifedist < 0) return pow(0.5, (bound(mindist, d, maxdist) - maxdist) / halflifedist);
+ if (halflifedist > 0) return (0.5 ** ((bound(mindist, d, maxdist) - mindist) / halflifedist));
+ else if (halflifedist < 0) return (0.5 ** ((bound(mindist, d, maxdist) - maxdist) / halflifedist));
else return 1;
}
float power2of(float e)
{
- return pow(2, e);
+ return (2 ** e);
}
float log2of(float e)