Skip to content

[BUG] Unexpected return value for sign of some 4-element uint64 array #2023

@stemann

Description

@stemann

sign for a some (randomly generated) 4-element uint64 array does not return the expected return value (an array of 0x0000000000000001), but instead returns an array of 0xffffffffffffffff.

The following test fails:

    array x_uint64({uint64_t(0xa11cc311cb6acd70), uint64_t(0x7a375ac3ebb533f3), uint64_t(0x734969adf9d7190c), uint64_t(0xb400515a4f673424)});
    array expected({uint64_t(0x0000000000000001), uint64_t(0x0000000000000001), uint64_t(0x0000000000000001), uint64_t(0x0000000000000001)});
    CHECK(array_equal(sign(x_uint64), expected).item<bool>());

To Reproduce

// fails
    array x_uint64({uint64_t(0xa11cc311cb6acd70), uint64_t(0x7a375ac3ebb533f3), uint64_t(0x734969adf9d7190c), uint64_t(0xb400515a4f673424)});
    array expected({uint64_t(0x0000000000000001), uint64_t(0x0000000000000001), uint64_t(0x0000000000000001), uint64_t(0x0000000000000001)});
    CHECK(array_equal(sign(x_uint64), expected).item<bool>());

// succeeds, wrong return value
    x_uint64 = array({uint64_t(0xa11cc311cb6acd70), uint64_t(0x7a375ac3ebb533f3), uint64_t(0x734969adf9d7190c), uint64_t(0xb400515a4f673424)});
    expected = array({uint64_t(0xffffffffffffffff), uint64_t(0xffffffffffffffff), uint64_t(0xffffffffffffffff), uint64_t(0xffffffffffffffff)});
    CHECK(array_equal(sign(x_uint64), expected).item<bool>());

// succeeds, the first three elements
    x_uint64 = array({uint64_t(0xa11cc311cb6acd70), uint64_t(0x7a375ac3ebb533f3), uint64_t(0x734969adf9d7190c)});
    expected = array({uint64_t(0x0000000000000001), uint64_t(0x0000000000000001), uint64_t(0x0000000000000001)});
    CHECK(array_equal(sign(x_uint64), expected).item<bool>());

// succeeds, the first two elements
    x_uint64 = array({uint64_t(0xa11cc311cb6acd70), uint64_t(0x7a375ac3ebb533f3)});
    expected = array({uint64_t(0x0000000000000001), uint64_t(0x0000000000000001)});
    CHECK(array_equal(sign(x_uint64), expected).item<bool>());

// succeeds, the first element
    x_uint64 = array({uint64_t(0xa11cc311cb6acd70)});
    expected = array({uint64_t(0x0000000000000001)});
    CHECK(array_equal(sign(x_uint64), expected).item<bool>());

// succeeds, 0xffffffffffffffff
    x_uint64 = array({uint64_t(0xffffffffffffffff)});
    expected = array({uint64_t(0x0000000000000001)});
    CHECK(array_equal(sign(x_uint64), expected).item<bool>());

// succeeds, 0x0000000000000001
    x_uint64 = array({uint64_t(0x0000000000000001)});
    expected = array({uint64_t(0x0000000000000001)});
    CHECK(array_equal(sign(x_uint64), expected).item<bool>());

Expected behavior

    array x_uint64({uint64_t(0xa11cc311cb6acd70), uint64_t(0x7a375ac3ebb533f3), uint64_t(0x734969adf9d7190c), uint64_t(0xb400515a4f673424)});
    array expected({uint64_t(0x0000000000000001), uint64_t(0x0000000000000001), uint64_t(0x0000000000000001), uint64_t(0x0000000000000001)});

Desktop (please complete the following information):

  • OS Version: MacOS 14.4.1 (Intel, x86_64)
  • Version master @ 13b2677 (post v0.24.1)

Additional context

Discovered in relation to implementing unary ops for Julia - and checking equivalence of unary ops wrt. Julia implementations: stemann/MLX.jl#14

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions