| 1545 | } |
| 1546 | |
| 1547 | AccuracyResult measure_pow(float exponent, float baseLo, float baseHi) { |
| 1548 | AccuracyResult r = {}; |
| 1549 | const int N = 10; // Spot testing: 10 key points adequate for base range coverage (was 50) |
| 1550 | float sumErr = 0; |
| 1551 | int count = 0; |
| 1552 | for (int i = 0; i < N; ++i) { |
| 1553 | float base = baseLo + (baseHi - baseLo) * i / (N - 1); |
| 1554 | float ref = fl::powf(base, exponent); |
| 1555 | if (ref > 32000.0f || ref < 0.0f) continue; |
| 1556 | float got = s16x16::pow(s16x16(base), s16x16(exponent)).to_float(); |
| 1557 | float err = fl::fabsf(got - ref); |
| 1558 | sumErr += err; |
| 1559 | ++count; |
| 1560 | if (err > r.maxErr) { r.maxErr = err; r.worstInput = base; } |
| 1561 | } |
| 1562 | r.avgErr = count > 0 ? sumErr / count : 0; |
| 1563 | r.nSamples = count; |
| 1564 | return r; |
| 1565 | } |
| 1566 | |
| 1567 | AccuracyResult measure_smoothstep() { |
| 1568 | AccuracyResult r = {}; |