1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//! `no_std` 用の float 数学関数 shim (IEEE 754 が厳密に規定する演算のみ)
//!
//! `std` あり: `f32` / `f64` の inherent method をそのまま使う (本 module は空)
//!
//! `std` なし (`--no-default-features`): core には無いので同名 method を
//! [`FloatExt`] trait で提供し、実装は [`libm`] (pure Rust、`no_std`) に委譲する
//! 各 module は `#[cfg(not(feature = "std"))] use crate::math::FloatExt;` で
//! 取り込む (`abs` / `clamp` / `is_finite` は core にあるので shim 不要)
//!
//! 本 trait が持つのは `sqrt` / `floor` / `round` の 3 つだけで、どれも
//! **IEEE 754 が結果を 1 通りに定めている** ので、`libm` と platform libm
//! (glibc / macOS / MSVC CRT) で bit 単位に一致する
//!
//! 超越関数 (`sin` / `cos` / `atan2` / `log2` 等) は本 trait に**置かない**
//! IEEE 754 はこれらに正確丸めを要求しないので実装ごとに最終 ulp が違い、
//! 「差は 1-2 ulp に留まる」は決定論の主張にならない (1 ulp 違えば別の bit で、
//! 法則の内容識別子 [`crate::law::SignalLaw::law_id`] が指す評価結果が変わる)
//! ⇒ `alice-det-math` 経由に統一し、`clippy.toml` の `disallowed-methods` で
//! platform 版への逆流を禁止している
//!
//! 実測 (2026-10-08、同一機で feature set のみを変えた比較): 超越関数を
//! platform libm に置いていた 0.5.2 では `generate_multi_sine` が 64 sample の
//! うち 1、`analyze_signal` が 9 field のうち 6 で bits が違った `alice-det-math`
//! へ移した後は 5 項目すべて一致する
// 本 trait が使われるのは `no_std` の lib build だけ test build は std が
// 繋がり inherent method が trait を隠すので、そこでは未使用になる