# Scalar / precision policy
This document records the decision for scalar/precision in `gemath`.
## Decision
- **Current policy**: `gemath` remains **`f32`-only** for core math types (`Vec*`, `Mat*`, `Quat`, geometry, collision, spatial).
- **Public naming**: expose a single alias `gemath::Real` which is currently `f32`.
- **Rationale**: this preserves a stable, predictable API while keeping the `no_std` posture (via `libm`) straightforward and avoiding a full generic rewrite.
This decision can be revisited later without pretending the crate is already generic.
## Why not “just make everything generic” (yet)
Core types are currently structurally `f32` (fields are `f32`). Making them generic over a scalar type would be a **large breaking change** and would require:
- a much larger trait surface than `GemathFloat` (constant sets, float classification, conversions, trig, etc.)
- careful performance evaluation (monomorphization, inlining behavior, SIMD posture)
- a more complex story for `no_std` floating-point math backends (especially for non-`f32` scalars)
- substantial test matrix expansion
## Considered alternatives (future directions)
- **Add `f64` “double” types** (glam-style approach):
- Add types like `DVec2/DVec3/DMat4/DQuat` in parallel to the existing `f32` types.
- Pros: avoids breaking the existing API; explicit at call sites.
- Cons: code duplication (or heavy internal refactors) and expanded maintenance/testing.
- **Add an `f64` feature that flips `Real` and recompiles the crate**:
- Would require refactoring all core types to store `Real` instead of `f32` (and auditing all constants and math calls).
- Pros: a single set of type names (`Vec2`, etc.) works for both precisions.
- Cons: larger refactor, higher risk of subtle behavior changes, and a bigger support matrix.
- **Full generic scalar types**:
- Most flexible, but most disruptive; likely needs a larger “numeric traits” design plus a staged migration plan.
## Current status checklist
- **Decision recorded**: yes (this doc).
- **Code surface reflects it**: `gemath::Real` is the official scalar alias and is currently `f32`.