Skip to content

feat(java): add float support#3254

Open
mengnankkkk wants to merge 23 commits intoapache:mainfrom
mengnankkkk:hotfix/add_float16
Open

feat(java): add float support#3254
mengnankkkk wants to merge 23 commits intoapache:mainfrom
mengnankkkk:hotfix/add_float16

Conversation

@mengnankkkk
Copy link
Contributor

@mengnankkkk mengnankkkk commented Feb 3, 2026

Why?

What does this PR do?

Related issues

Close #3205

Does this PR introduce any user-facing change?

  • Does this PR introduce any public API change?
  • Does this PR introduce any binary protocol compatibility change?

Benchmark

Co-authored-by: Shawn Yang <chaokunyang@apache.org>
@chaokunyang
Copy link
Collaborator

Could you also address those issues?

  1. XLANG support for new Float16 types is broken at runtime.
    Float16/Float16List serializers are added (PrimitiveSerializers.java, PrimitiveListSerializers.java), but internal xlang type registration is missing in resolver bootstrap (ClassResolver.java). In xlang mode it falls back to unsupported-class path and fails at deserialize time.

    • java/fory-core/src/main/java/org/apache/fory/serializer/PrimitiveSerializers.java:381
    • java/fory-core/src/main/java/org/apache/fory/serializer/collection/PrimitiveListSerializers.java:595
    • java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java:262
    • java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java:295
    • java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java:1305
  2. Float16 subnormal decode is numerically wrong.
    In float16BitsToFloat, subnormal conversion uses an incorrect shift/exponent formula.

    • java/fory-core/src/main/java/org/apache/fory/type/Float16.java:169
    • java/fory-core/src/main/java/org/apache/fory/type/Float16.java:173
      Repro: Float16.fromBits((short)0x0001).floatValue() returns 1.7881393E-7, expected 5.9604645E-8 (2^-24).
  3. Float16[] serializer crashes on legal arrays containing null.
    The array fast path dereferences element directly (value[i].toBits()), so new Float16[]{Float16.ONE, null} throws NPE.

    • java/fory-core/src/main/java/org/apache/fory/serializer/ArraySerializers.java:901
  4. Type-id mapping regression for existing float kinds.
    Types.getClassForTypeId now maps FLOAT8 to Float16, and BFLOAT16 mapping was removed (falls through to null).

    • java/fory-core/src/main/java/org/apache/fory/type/Types.java:450
    • java/fory-core/src/main/java/org/apache/fory/type/Types.java:452
  5. Generated Java equals/hashCode contract can break for float16.
    Generator uses equalsValue for FLOAT16 equality, but default hash path remains Objects.hash(...). equalsValue treats +0 and -0 as equal, while Float16.hashCode is bit-based.

    • compiler/fory_compiler/generators/java.py:1384
    • compiler/fory_compiler/generators/java.py:1467
    • java/fory-core/src/main/java/org/apache/fory/type/Float16.java:270
    • java/fory-core/src/main/java/org/apache/fory/type/Float16.java:334

}

@Override
public void xwrite(MemoryBuffer buffer, Float16 value) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove it, we don' have xwrite/xread methods any more

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Java] add float16 support to java

2 participants