From 96c3c5ca36a2580853495bd0aa5984e07ef50ca2 Mon Sep 17 00:00:00 2001 From: He-Pin Date: Wed, 10 Jun 2026 14:59:10 +0800 Subject: [PATCH] fix: std.primitiveEquals(-0.0, 0.0) should return true Motivation: std.primitiveEquals(-0.0, 0.0) was returning false instead of true. This is incorrect because IEEE 754 defines -0.0 == 0.0 as true. Modification: Changed TypeModule.scala to use rawDouble == rawDouble for number comparison instead of ev.compare(x, y) == 0 which uses java.lang.Double.compare that treats -0.0 and 0.0 as different. Result: std.primitiveEquals(-0.0, 0.0) now returns true, matching go-jsonnet and C++ jsonnet behavior. References: - go-jsonnet builtins.go:264 uses left.value == right.value - C++ Jsonnet vm.cpp:1436 uses args[0].v.d == args[1].v.d --- sjsonnet/src/sjsonnet/stdlib/TypeModule.scala | 4 ++-- .../primitive_equals_negative_zero.jsonnet | 9 +++++++++ .../primitive_equals_negative_zero.jsonnet.golden | 1 + 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 sjsonnet/test/resources/new_test_suite/primitive_equals_negative_zero.jsonnet create mode 100644 sjsonnet/test/resources/new_test_suite/primitive_equals_negative_zero.jsonnet.golden diff --git a/sjsonnet/src/sjsonnet/stdlib/TypeModule.scala b/sjsonnet/src/sjsonnet/stdlib/TypeModule.scala index 4782f9e8e..8750849e7 100644 --- a/sjsonnet/src/sjsonnet/stdlib/TypeModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/TypeModule.scala @@ -179,8 +179,8 @@ object TypeModule extends AbstractFunctionModule { false } else { (x, y) match { - case (_: Val.Num, _: Val.Num) => - ev.compare(x, y) == 0 + case (x: Val.Num, y: Val.Num) => + x.rawDouble == y.rawDouble case (_: Val.Str, _: Val.Str) => ev.compare(x, y) == 0 case (_: Val.Bool, _: Val.Bool) => diff --git a/sjsonnet/test/resources/new_test_suite/primitive_equals_negative_zero.jsonnet b/sjsonnet/test/resources/new_test_suite/primitive_equals_negative_zero.jsonnet new file mode 100644 index 000000000..5c03cb133 --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/primitive_equals_negative_zero.jsonnet @@ -0,0 +1,9 @@ +// std.primitiveEquals must treat -0.0 and 0.0 as equal (IEEE 754 semantics). +// This matches go-jsonnet and C++ jsonnet behavior. +std.assertEqual(std.primitiveEquals(-0.0, 0.0), true) && +std.assertEqual(std.primitiveEquals(0.0, -0.0), true) && +std.assertEqual(std.primitiveEquals(-0.0, -0.0), true) && +std.assertEqual(std.primitiveEquals(0.0, 0.0), true) && +std.assertEqual(std.primitiveEquals(-0.0, 1.0), false) && +std.assertEqual(std.primitiveEquals(0.0, 1.0), false) && +true diff --git a/sjsonnet/test/resources/new_test_suite/primitive_equals_negative_zero.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/primitive_equals_negative_zero.jsonnet.golden new file mode 100644 index 000000000..27ba77dda --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/primitive_equals_negative_zero.jsonnet.golden @@ -0,0 +1 @@ +true