gemath 0.1.0

Type-safe game math with type-level units/spaces, typed angles, and explicit fallible ops (plus optional geometry/collision).
Documentation
# 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`.