cocoa-xu commented on code in PR #499:
URL: https://github.com/apache/arrow-nanoarrow/pull/499#discussion_r1621206077
##########
src/nanoarrow/array_test.cc:
##########
@@ -787,6 +787,43 @@ TEST(ArrayTest, ArrayTestAppendToFloatArray) {
EXPECT_TRUE(arrow_array.ValueUnsafe()->Equals(expected_array.ValueUnsafe(),
options));
}
+TEST(ArrayTest, ArrayTestAppendToHalfFloatArray) {
+ struct ArrowArray array;
+
+ ASSERT_EQ(ArrowArrayInitFromType(&array, NANOARROW_TYPE_HALF_FLOAT),
NANOARROW_OK);
+ EXPECT_EQ(ArrowArrayStartAppending(&array), NANOARROW_OK);
+ EXPECT_EQ(ArrowArrayAppendInt(&array, 1), NANOARROW_OK);
+ EXPECT_EQ(ArrowArrayAppendNull(&array, 2), NANOARROW_OK);
+ EXPECT_EQ(ArrowArrayAppendUInt(&array, 3), NANOARROW_OK);
+ EXPECT_EQ(ArrowArrayAppendDouble(&array, 3.14), NANOARROW_OK);
+ EXPECT_EQ(ArrowArrayAppendDouble(&array, std::numeric_limits<float>::max()),
+ NANOARROW_OK);
+ EXPECT_EQ(ArrowArrayAppendDouble(&array, NAN), NANOARROW_OK);
+ EXPECT_EQ(ArrowArrayAppendDouble(&array, INFINITY), NANOARROW_OK);
+ EXPECT_EQ(ArrowArrayAppendDouble(&array, -INFINITY), NANOARROW_OK);
+ EXPECT_EQ(ArrowArrayAppendDouble(&array, -1), NANOARROW_OK);
+ EXPECT_EQ(ArrowArrayAppendDouble(&array, 0), NANOARROW_OK);
+ EXPECT_EQ(ArrowArrayFinishBuildingDefault(&array, nullptr), NANOARROW_OK);
+
+ EXPECT_EQ(array.length, 11);
+ EXPECT_EQ(array.null_count, 2);
+ auto validity_buffer = reinterpret_cast<const uint8_t*>(array.buffers[0]);
+ auto data_buffer = reinterpret_cast<const uint16_t*>(array.buffers[1]);
+ EXPECT_EQ(validity_buffer[0], 0b11111001);
+ EXPECT_EQ(validity_buffer[1], 0b00000111);
+ EXPECT_EQ(data_buffer[0], 15360);
+ EXPECT_EQ(data_buffer[1], 0);
+ EXPECT_EQ(data_buffer[2], 0);
+ EXPECT_EQ(data_buffer[3], 16896);
+ EXPECT_EQ(data_buffer[4], 16967);
+ EXPECT_EQ(data_buffer[5], 31744);
+ EXPECT_EQ(data_buffer[6], 32256);
+ EXPECT_EQ(data_buffer[7], 31744);
+ EXPECT_EQ(data_buffer[8], 64512);
+ EXPECT_EQ(data_buffer[9], 48128);
+ EXPECT_EQ(data_buffer[10], 0);
Review Comment:
I found that it wasn't that easy to do a bit cast in numpy (compare to C),
and since the users will probably also need to convert half floats to floats, I
decide to add an `ArrowHalfFloatToFloat` function.
In this way, we can simply do a round trip test between half floats <=>
floats and no need to worry about how these weird numbers were generated. :)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]