feat(fixed): add Q32.32 deterministic fixed-point arithmetic
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
52
pkg/fixed/nofloat_test.go
Normal file
52
pkg/fixed/nofloat_test.go
Normal file
@@ -0,0 +1,52 @@
|
||||
package fixed_test
|
||||
|
||||
import (
|
||||
"go/ast"
|
||||
"go/parser"
|
||||
"go/token"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// Determinism depends on there being no floating-point arithmetic anywhere in
|
||||
// the simulation path: floats drift between architectures and between native
|
||||
// and WASM builds, which would silently break round verification. This test
|
||||
// fails the build if a float type is ever introduced.
|
||||
//
|
||||
// Test files are exempt, since statistical assertions legitimately use floats.
|
||||
func TestNoFloatingPointInDeterministicPackages(t *testing.T) {
|
||||
for _, dir := range []string{".", "../sim"} {
|
||||
if _, err := os.Stat(dir); os.IsNotExist(err) {
|
||||
continue
|
||||
}
|
||||
fset := token.NewFileSet()
|
||||
pkgs, err := parser.ParseDir(fset, dir, nil, 0)
|
||||
if err != nil {
|
||||
t.Fatalf("parse %s: %v", dir, err)
|
||||
}
|
||||
for _, pkg := range pkgs {
|
||||
for name, file := range pkg.Files {
|
||||
if strings.HasSuffix(name, "_test.go") {
|
||||
continue
|
||||
}
|
||||
ast.Inspect(file, func(n ast.Node) bool {
|
||||
switch node := n.(type) {
|
||||
case *ast.Ident:
|
||||
if node.Name == "float32" || node.Name == "float64" {
|
||||
t.Errorf("%s: forbidden float type %q in deterministic package",
|
||||
filepath.Base(name), node.Name)
|
||||
}
|
||||
case *ast.BasicLit:
|
||||
if node.Kind == token.FLOAT {
|
||||
t.Errorf("%s: forbidden float literal %s",
|
||||
filepath.Base(name), node.Value)
|
||||
}
|
||||
}
|
||||
return true
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user