feat(lang): strict numbers in float files; render3d on float
A numbers float file adapts decimal literals to a fixed operand or slot, and refuses to promote a computed int to a float implicitly: there it is almost always float bits. Explicit float(x) is always allowed. render3d's numbers are float, converted by tools/migrate/floatbits.py - a whole-program inference of which ints carried IEEE bits (union-find over flows, calls, returns, buffers, nested buffers and lexical scopes) and a rewriter to operators, Math.* and float literals, with float_bits / float_from_bits left only where bits really cross (runtime scratch buffers, mixed buffers). Seed regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
3ac0d8d5cb
commit
cc89fc37a4
35 changed files with 57282 additions and 54382 deletions
|
|
@ -1537,7 +1537,11 @@ function emit_expr(e: Node) -> Val {
|
|||
if e.kind == E_UN {
|
||||
let a = emit_expr(e.a)
|
||||
if is_fp(a.ty) {
|
||||
if (e.s == ("-")) { return val(emit_bind(`fneg {a.ty} {a.code}`), a.ty) }
|
||||
if (e.s == ("-")) {
|
||||
let nf = val(emit_bind(`fneg {a.ty} {a.code}`), a.ty)
|
||||
if (a.lit != null) { nf.lit = e } # -1.5 stays a literal: a fixed slot can still take it
|
||||
return nf
|
||||
}
|
||||
perr(`operator {e.s} does not apply to {a.ty}`)
|
||||
}
|
||||
if (e.s == ("-")) and (a.lit != null) { # -1.5 stays a literal: exact in a float context
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue