
# Objective
Different platforms use their own implementations of several
mathematical functions (especially transcendental functions like sin,
cos, tan, atan, and so on) to provide hardware-level optimization using
intrinsics. This is good for performance, but bad when you expect
consistent outputs across machines.
[`libm`](https://github.com/rust-lang/libm) is a widely used crate that
provides mathematical functions that don't use intrinsics like `std`
functions. This allows bit-for-bit deterministic math across hardware,
which is crucial for things like cross-platform deterministic physics
simulation.
Glam has the `libm` feature for using [`libm` for the
math](d2871a151b/src/f32/math.rs (L35)
)
in its own types. This would be nice to expose as a feature in
`bevy_math`.
## Solution
Add `libm` feature to `bevy_math`. We could name it something like
`enhanced-determinism`, but this wouldn't be accurate for the rest of
Bevy, so I think just `libm` is more fitting and explicit.
31 lines
1.1 KiB
TOML
31 lines
1.1 KiB
TOML
[package]
|
|
name = "bevy_math"
|
|
version = "0.12.0"
|
|
edition = "2021"
|
|
description = "Provides math functionality for Bevy Engine"
|
|
homepage = "https://bevyengine.org"
|
|
repository = "https://github.com/bevyengine/bevy"
|
|
license = "MIT OR Apache-2.0"
|
|
keywords = ["bevy"]
|
|
|
|
[dependencies]
|
|
glam = { version = "0.24.1", features = ["bytemuck"] }
|
|
serde = { version = "1", features = ["derive"], optional = true }
|
|
|
|
[features]
|
|
serialize = ["dep:serde", "glam/serde"]
|
|
# Enable approx for glam types to approximate floating point equality comparisons and assertions
|
|
approx = ["glam/approx"]
|
|
# Enable interoperation of glam types with mint-compatible libraries
|
|
mint = ["glam/mint"]
|
|
# Enable libm mathematical functions for glam types to ensure consistent outputs
|
|
# across platforms at the cost of losing hardware-level optimization using intrinsics
|
|
libm = ["glam/libm"]
|
|
# Enable assertions to check the validity of parameters passed to glam
|
|
glam_assert = ["glam/glam-assert"]
|
|
# Enable assertions in debug builds to check the validity of parameters passed to glam
|
|
debug_glam_assert = ["glam/debug-glam-assert"]
|
|
|
|
[lints]
|
|
workspace = true
|