Skip to content

Commit

Permalink
Fix DivideOp: change resulting type to float64
Browse files Browse the repository at this point in the history
Fixes #270

Signed-off-by: Furkan <[email protected]>
  • Loading branch information
Dentrax committed Nov 4, 2022
1 parent 07e6b41 commit 1ed2514
Show file tree
Hide file tree
Showing 4 changed files with 168 additions and 103 deletions.
61 changes: 61 additions & 0 deletions expr_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1449,6 +1449,67 @@ func TestIssue154(t *testing.T) {
}
}

func TestIssue270(t *testing.T) {
env := map[string]interface{}{
"int8": int8(1),
"int16": int16(3),
"int32": int32(5),
"int64": int64(7),
"uint8": uint8(11),
"uint16": uint16(13),
"uint32": uint32(17),
"uint64": uint64(19),
"int8a": uint(23),
"int8b": uint(29),
"int16a": uint(31),
"int16b": uint(37),
"int32a": uint(41),
"int32b": uint(43),
"int64a": uint(47),
"int64b": uint(53),
"uint8a": uint(59),
"uint8b": uint(61),
"uint16a": uint(67),
"uint16b": uint(71),
"uint32a": uint(73),
"uint32b": uint(79),
"uint64a": uint(83),
"uint64b": uint(89),
"float32a": float32(97),
"float32b": float32(101),
"float64a": float64(103),
"float64b": float64(107),
}
for _, each := range []struct {
input string
expected float64
}{
{"int8 / int16", 0.3333333333333333},
{"int32 / int64", 0.7142857142857143},
{"uint8 / uint16", 0.8461538461538461},
{"uint32 / uint64", 0.8947368421052632},
{"int8 / uint64", 0.05263157894736842},
{"int64 / uint8", 0.6363636363636364},
{"int8a / int8b", 0.7931034482758621},
{"int16a / int16b", 0.8378378378378378},
{"int32a / int32b", 0.9534883720930233},
{"int64a / int64b", 0.8867924528301887},
{"uint8a / uint8b", 0.9672131147540983},
{"uint16a / uint16b", 0.9436619718309859},
{"uint32a / uint32b", 0.9240506329113924},
{"uint64a / uint64b", 0.9325842696629213},
{"float32a / float32b", 0.9603960514068604},
{"float64a / float64b", 0.9626168224299065},
} {
p, err := expr.Compile(each.input, expr.Env(env))
require.NoError(t, err)

out, err := expr.Run(p, env)
require.NoError(t, err)
require.Equal(t, each.expected, out)
}
}

// Mock types
type mockEnv struct {
Any interface{}
Expand Down
4 changes: 4 additions & 0 deletions vm/runtime/generate/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ func cases(op string, noFloat bool) string {
t = "float64"
}
echo(`case %v:`, b)
if op == "/" {
echo(`return float64(x) / float64(y)`)
continue
}
if i == j {
echo(`return x %v y`, op)
}
Expand Down
Loading

0 comments on commit 1ed2514

Please sign in to comment.