usearch 2.9.2 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -38
- package/javascript/{types → dist/cjs}/usearch.d.ts +90 -115
- package/javascript/dist/cjs/usearch.js +531 -0
- package/javascript/dist/esm/usearch.d.ts +212 -0
- package/javascript/{usearch.js → dist/esm/usearch.js} +199 -153
- package/package.json +25 -23
- package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
- package/prebuilds/linux-arm64/usearch.node +0 -0
- package/prebuilds/linux-x64/usearch.node +0 -0
- package/prebuilds/win32-ia32/usearch.node +0 -0
- package/prebuilds/win32-x64/usearch.node +0 -0
- package/.clang-format +0 -10
- package/.clang-tidy +0 -60
- package/.cmake-format.py +0 -19
- package/.dockerignore +0 -93
- package/.gitattributes +0 -9
- package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -90
- package/.github/ISSUE_TEMPLATE/config.yml +0 -5
- package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -64
- package/.github/workflows/Dockerfile.libs +0 -36
- package/.github/workflows/prerelease.yml +0 -331
- package/.github/workflows/release.yml +0 -722
- package/.github/workflows/update_version.sh +0 -15
- package/.gitmodules +0 -9
- package/.releaserc +0 -90
- package/CITATION.cff +0 -11
- package/CMakeLists.txt +0 -324
- package/CODE_OF_CONDUCT.md +0 -128
- package/CONTRIBUTING.md +0 -361
- package/Cargo.toml +0 -19
- package/Dockerfile +0 -16
- package/VERSION +0 -1
- package/assets/unum.png +0 -0
- package/assets/usearch-approaches-transparent.png +0 -0
- package/assets/usearch-approaches-white.png +0 -0
- package/assets/usearch-neighbor-types.png +0 -0
- package/binding.gyp +0 -87
- package/build.gradle +0 -204
- package/build.rs +0 -18
- package/c/CMakeLists.txt +0 -25
- package/c/README.md +0 -34
- package/c/lib.cpp +0 -358
- package/c/test.c +0 -382
- package/c/usearch.h +0 -311
- package/cmake/clipp.cmake +0 -7
- package/cmake/config.cmake.in +0 -15
- package/cmake/emscripten.cmake +0 -8
- package/cmake/jemalloc.cmake +0 -62
- package/cmake/pkg-config.pc.in +0 -4
- package/cmake/usearchConfigVersion.cmake.in +0 -20
- package/conanfile.py +0 -26
- package/cpp/CMakeLists.txt +0 -14
- package/cpp/README.md +0 -161
- package/cpp/bench.cpp +0 -618
- package/cpp/test.cpp +0 -323
- package/fp16/CMakeLists.txt +0 -176
- package/fp16/LICENSE +0 -11
- package/fp16/README.md +0 -20
- package/fp16/bench/alt-element.cc +0 -89
- package/fp16/bench/from-alt-array.cc +0 -175
- package/fp16/bench/from-ieee-array.cc +0 -399
- package/fp16/bench/ieee-element.cc +0 -272
- package/fp16/bench/to-alt-array.cc +0 -91
- package/fp16/bench/to-ieee-array.cc +0 -303
- package/fp16/cmake/DownloadGoogleBenchmark.cmake +0 -15
- package/fp16/cmake/DownloadGoogleTest.cmake +0 -15
- package/fp16/cmake/DownloadPSimd.cmake +0 -15
- package/fp16/configure.py +0 -65
- package/fp16/confu.yaml +0 -8
- package/fp16/include/fp16/__init__.py +0 -0
- package/fp16/include/fp16/avx.py +0 -50
- package/fp16/include/fp16/avx2.py +0 -53
- package/fp16/include/fp16/bitcasts.h +0 -92
- package/fp16/include/fp16/fp16.h +0 -451
- package/fp16/include/fp16/psimd.h +0 -131
- package/fp16/include/fp16.h +0 -11
- package/fp16/jni/Android.mk +0 -6
- package/fp16/jni/Application.mk +0 -4
- package/fp16/test/alt-from-fp32-value.cc +0 -498
- package/fp16/test/alt-to-fp32-bits.cc +0 -263
- package/fp16/test/alt-to-fp32-psimd.cc +0 -145
- package/fp16/test/alt-to-fp32-value.cc +0 -348
- package/fp16/test/alt-to-fp32x2-psimd.cc +0 -245
- package/fp16/test/bitcasts.cc +0 -56
- package/fp16/test/ieee-from-fp32-value.cc +0 -523
- package/fp16/test/ieee-to-fp32-bits.cc +0 -333
- package/fp16/test/ieee-to-fp32-psimd.cc +0 -312
- package/fp16/test/ieee-to-fp32-value.cc +0 -420
- package/fp16/test/ieee-to-fp32x2-psimd.cc +0 -541
- package/fp16/test/peachpy/alt-xmm-to-fp32-xmm-avx.cc +0 -96
- package/fp16/test/peachpy/alt-xmm-to-fp32-ymm-avx2.cc +0 -96
- package/fp16/test/peachpy/stubs.py +0 -38
- package/fp16/test/tables.cc +0 -530
- package/fp16/test/tables.h +0 -13
- package/fp16/third-party/THHalf.h +0 -92
- package/fp16/third-party/eigen-half.h +0 -170
- package/fp16/third-party/float16-compressor.h +0 -80
- package/fp16/third-party/half.hpp +0 -2916
- package/fp16/third-party/npy-halffloat.h +0 -328
- package/include/usearch/index.hpp +0 -3836
- package/include/usearch/index_dense.hpp +0 -2004
- package/include/usearch/index_plugins.hpp +0 -2213
- package/javascript/lib.cpp +0 -341
- package/javascript/types/usearch.d.ts.map +0 -1
- package/javascript/usearch.test.js +0 -74
- package/package-ci.json +0 -10
- package/pyproject.toml +0 -51
- package/setup.py +0 -201
- package/simsimd/.releaserc +0 -86
- package/simsimd/CONTRIBUTING.md +0 -88
- package/simsimd/Cargo.lock +0 -709
- package/simsimd/Cargo.toml +0 -44
- package/simsimd/LICENSE +0 -201
- package/simsimd/README.md +0 -317
- package/simsimd/binding.gyp +0 -36
- package/simsimd/build.rs +0 -20
- package/simsimd/include/simsimd/binary.h +0 -245
- package/simsimd/include/simsimd/complex.h +0 -174
- package/simsimd/include/simsimd/probability.h +0 -548
- package/simsimd/include/simsimd/simsimd.h +0 -465
- package/simsimd/include/simsimd/spatial.h +0 -1267
- package/simsimd/include/simsimd/types.h +0 -208
- package/simsimd/javascript/bench.js +0 -127
- package/simsimd/javascript/fallback.ts +0 -193
- package/simsimd/javascript/lib.c +0 -102
- package/simsimd/javascript/node-gyp-build.d.ts +0 -1
- package/simsimd/javascript/simsimd.ts +0 -124
- package/simsimd/javascript/test.mjs +0 -153
- package/simsimd/javascript/tsconfig-base.json +0 -25
- package/simsimd/javascript/tsconfig-cjs.json +0 -8
- package/simsimd/javascript/tsconfig-esm.json +0 -8
- package/simsimd/package-lock.json +0 -1688
- package/simsimd/package.json +0 -61
- package/simsimd/rust/benches/cosine.rs +0 -27
- package/simsimd/rust/benches/native.rs +0 -30
- package/simsimd/rust/benches/sqeuclidean.rs +0 -27
- package/simsimd/rust/lib.c +0 -45
- package/simsimd/rust/lib.rs +0 -550
- package/sqlite/README.md +0 -178
- package/sqlite/lib.cpp +0 -325
- package/stringzilla/CONTRIBUTING.md +0 -446
- package/stringzilla/Cargo.lock +0 -25
- package/stringzilla/Cargo.toml +0 -26
- package/stringzilla/LICENSE +0 -201
- package/stringzilla/README.md +0 -1422
- package/stringzilla/VERSION +0 -1
- package/stringzilla/assets/cover-strinzilla.jpeg +0 -0
- package/stringzilla/assets/meme-stringzilla-v2.jpeg +0 -0
- package/stringzilla/assets/meme-stringzilla-v3.jpeg +0 -0
- package/stringzilla/binding.gyp +0 -16
- package/stringzilla/build.rs +0 -87
- package/stringzilla/c/lib.c +0 -337
- package/stringzilla/cli/README.md +0 -65
- package/stringzilla/cli/__init__.py +0 -0
- package/stringzilla/cli/split.py +0 -105
- package/stringzilla/cli/wc.py +0 -117
- package/stringzilla/include/stringzilla/experimental.h +0 -845
- package/stringzilla/include/stringzilla/module.modulemap +0 -9
- package/stringzilla/include/stringzilla/stringzilla.h +0 -5370
- package/stringzilla/include/stringzilla/stringzilla.hpp +0 -3838
- package/stringzilla/javascript/lib.c +0 -125
- package/stringzilla/javascript/stringzilla.js +0 -22
- package/stringzilla/package-ci.json +0 -10
- package/stringzilla/package.json +0 -32
- package/stringzilla/rust/lib.rs +0 -873
- package/stringzilla/swift/StringProtocol+StringZilla.swift +0 -280
- package/stringzilla/swift/Test.swift +0 -60
- package/tsconfig.json +0 -21
- package/wasmer.toml +0 -12
- package/winlibinstaller.bat +0 -42
- /package/{simsimd/javascript/dist-package-cjs.json → javascript/dist/cjs/package.json} +0 -0
- /package/{simsimd/javascript/dist-package-esm.json → javascript/dist/esm/package.json} +0 -0
|
@@ -1,420 +0,0 @@
|
|
|
1
|
-
#include <gtest/gtest.h>
|
|
2
|
-
|
|
3
|
-
#include <cstdint>
|
|
4
|
-
#include <cmath>
|
|
5
|
-
|
|
6
|
-
#include <fp16.h>
|
|
7
|
-
#include <tables.h>
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
TEST(FP16_IEEE_TO_FP32_VALUE, normalized_powers_of_2) {
|
|
11
|
-
const uint16_t min_po2_f16 = UINT16_C(0x0400);
|
|
12
|
-
const uint16_t eighths_f16 = UINT16_C(0x3000);
|
|
13
|
-
const uint16_t quarter_f16 = UINT16_C(0x3400);
|
|
14
|
-
const uint16_t half_f16 = UINT16_C(0x3800);
|
|
15
|
-
const uint16_t one_f16 = UINT16_C(0x3C00);
|
|
16
|
-
const uint16_t two_f16 = UINT16_C(0x4000);
|
|
17
|
-
const uint16_t four_f16 = UINT16_C(0x4400);
|
|
18
|
-
const uint16_t eight_f16 = UINT16_C(0x4800);
|
|
19
|
-
const uint16_t sixteen_f16 = UINT16_C(0x4C00);
|
|
20
|
-
const uint16_t thirtytwo_f16 = UINT16_C(0x5000);
|
|
21
|
-
const uint16_t sixtyfour_f16 = UINT16_C(0x5400);
|
|
22
|
-
const uint16_t max_po2_f16 = UINT16_C(0x7800);
|
|
23
|
-
|
|
24
|
-
const uint32_t min_po2_f32 = UINT32_C(0x38800000);
|
|
25
|
-
const uint32_t eighths_f32 = UINT32_C(0x3E000000);
|
|
26
|
-
const uint32_t quarter_f32 = UINT32_C(0x3E800000);
|
|
27
|
-
const uint32_t half_f32 = UINT32_C(0x3F000000);
|
|
28
|
-
const uint32_t one_f32 = UINT32_C(0x3F800000);
|
|
29
|
-
const uint32_t two_f32 = UINT32_C(0x40000000);
|
|
30
|
-
const uint32_t four_f32 = UINT32_C(0x40800000);
|
|
31
|
-
const uint32_t eight_f32 = UINT32_C(0x41000000);
|
|
32
|
-
const uint32_t sixteen_f32 = UINT32_C(0x41800000);
|
|
33
|
-
const uint32_t thirtytwo_f32 = UINT32_C(0x42000000);
|
|
34
|
-
const uint32_t sixtyfour_f32 = UINT32_C(0x42800000);
|
|
35
|
-
const uint32_t max_po2_f32 = UINT32_C(0x47000000);
|
|
36
|
-
|
|
37
|
-
const float min_po2_value = fp16_ieee_to_fp32_value(min_po2_f16);
|
|
38
|
-
uint32_t min_po2_bits;
|
|
39
|
-
memcpy(&min_po2_bits, &min_po2_value, sizeof(min_po2_bits));
|
|
40
|
-
EXPECT_EQ(min_po2_f32, min_po2_bits) <<
|
|
41
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
42
|
-
"F16 = 0x" << std::setw(4) << min_po2_f16 << ", " <<
|
|
43
|
-
"F32(F16) = 0x" << std::setw(8) << min_po2_bits << ", " <<
|
|
44
|
-
"F32 = 0x" << std::setw(8) << min_po2_f32;
|
|
45
|
-
|
|
46
|
-
const float eighths_value = fp16_ieee_to_fp32_value(eighths_f16);
|
|
47
|
-
uint32_t eighths_bits;
|
|
48
|
-
memcpy(&eighths_bits, &eighths_value, sizeof(eighths_bits));
|
|
49
|
-
EXPECT_EQ(eighths_f32, eighths_bits) <<
|
|
50
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
51
|
-
"F16 = 0x" << std::setw(4) << eighths_f16 << ", " <<
|
|
52
|
-
"F32(F16) = 0x" << std::setw(8) << eighths_bits << ", " <<
|
|
53
|
-
"F32 = 0x" << std::setw(8) << eighths_f32;
|
|
54
|
-
|
|
55
|
-
const float quarter_value = fp16_ieee_to_fp32_value(quarter_f16);
|
|
56
|
-
uint32_t quarter_bits;
|
|
57
|
-
memcpy(&quarter_bits, &quarter_value, sizeof(quarter_bits));
|
|
58
|
-
EXPECT_EQ(quarter_f32, quarter_bits) <<
|
|
59
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
60
|
-
"F16 = 0x" << std::setw(4) << quarter_f16 << ", " <<
|
|
61
|
-
"F32(F16) = 0x" << std::setw(8) << quarter_bits << ", " <<
|
|
62
|
-
"F32 = 0x" << std::setw(8) << quarter_f32;
|
|
63
|
-
|
|
64
|
-
const float half_value = fp16_ieee_to_fp32_value(half_f16);
|
|
65
|
-
uint32_t half_bits;
|
|
66
|
-
memcpy(&half_bits, &half_value, sizeof(half_bits));
|
|
67
|
-
EXPECT_EQ(half_f32, half_bits) <<
|
|
68
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
69
|
-
"F16 = 0x" << std::setw(4) << half_f16 << ", " <<
|
|
70
|
-
"F32(F16) = 0x" << std::setw(8) << half_bits << ", " <<
|
|
71
|
-
"F32 = 0x" << std::setw(8) << half_f32;
|
|
72
|
-
|
|
73
|
-
const float one_value = fp16_ieee_to_fp32_value(one_f16);
|
|
74
|
-
uint32_t one_bits;
|
|
75
|
-
memcpy(&one_bits, &one_value, sizeof(one_bits));
|
|
76
|
-
EXPECT_EQ(one_f32, one_bits) <<
|
|
77
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
78
|
-
"F16 = 0x" << std::setw(4) << one_f16 << ", " <<
|
|
79
|
-
"F32(F16) = 0x" << std::setw(8) << one_bits << ", " <<
|
|
80
|
-
"F32 = 0x" << std::setw(8) << one_f32;
|
|
81
|
-
|
|
82
|
-
const float two_value = fp16_ieee_to_fp32_value(two_f16);
|
|
83
|
-
uint32_t two_bits;
|
|
84
|
-
memcpy(&two_bits, &two_value, sizeof(two_bits));
|
|
85
|
-
EXPECT_EQ(two_f32, two_bits) <<
|
|
86
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
87
|
-
"F16 = 0x" << std::setw(4) << two_f16 << ", " <<
|
|
88
|
-
"F32(F16) = 0x" << std::setw(8) << two_bits << ", " <<
|
|
89
|
-
"F32 = 0x" << std::setw(8) << two_f32;
|
|
90
|
-
|
|
91
|
-
const float four_value = fp16_ieee_to_fp32_value(four_f16);
|
|
92
|
-
uint32_t four_bits;
|
|
93
|
-
memcpy(&four_bits, &four_value, sizeof(four_bits));
|
|
94
|
-
EXPECT_EQ(four_f32, four_bits) <<
|
|
95
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
96
|
-
"F16 = 0x" << std::setw(4) << four_f16 << ", " <<
|
|
97
|
-
"F32(F16) = 0x" << std::setw(8) << four_bits << ", " <<
|
|
98
|
-
"F32 = 0x" << std::setw(8) << four_f32;
|
|
99
|
-
|
|
100
|
-
const float eight_value = fp16_ieee_to_fp32_value(eight_f16);
|
|
101
|
-
uint32_t eight_bits;
|
|
102
|
-
memcpy(&eight_bits, &eight_value, sizeof(eight_bits));
|
|
103
|
-
EXPECT_EQ(eight_f32, eight_bits) <<
|
|
104
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
105
|
-
"F16 = 0x" << std::setw(4) << eight_f16 << ", " <<
|
|
106
|
-
"F32(F16) = 0x" << std::setw(8) << eight_bits << ", " <<
|
|
107
|
-
"F32 = 0x" << std::setw(8) << eight_f32;
|
|
108
|
-
|
|
109
|
-
const float sixteen_value = fp16_ieee_to_fp32_value(sixteen_f16);
|
|
110
|
-
uint32_t sixteen_bits;
|
|
111
|
-
memcpy(&sixteen_bits, &sixteen_value, sizeof(sixteen_bits));
|
|
112
|
-
EXPECT_EQ(sixteen_f32, sixteen_bits) <<
|
|
113
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
114
|
-
"F16 = 0x" << std::setw(4) << sixteen_f16 << ", " <<
|
|
115
|
-
"F32(F16) = 0x" << std::setw(8) << sixteen_bits << ", " <<
|
|
116
|
-
"F32 = 0x" << std::setw(8) << sixteen_f32;
|
|
117
|
-
|
|
118
|
-
const float thirtytwo_value = fp16_ieee_to_fp32_value(thirtytwo_f16);
|
|
119
|
-
uint32_t thirtytwo_bits;
|
|
120
|
-
memcpy(&thirtytwo_bits, &thirtytwo_value, sizeof(thirtytwo_bits));
|
|
121
|
-
EXPECT_EQ(thirtytwo_f32, thirtytwo_bits) <<
|
|
122
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
123
|
-
"F16 = 0x" << std::setw(4) << thirtytwo_f16 << ", " <<
|
|
124
|
-
"F32(F16) = 0x" << std::setw(8) << thirtytwo_bits << ", " <<
|
|
125
|
-
"F32 = 0x" << std::setw(8) << thirtytwo_f32;
|
|
126
|
-
|
|
127
|
-
const float sixtyfour_value = fp16_ieee_to_fp32_value(sixtyfour_f16);
|
|
128
|
-
uint32_t sixtyfour_bits;
|
|
129
|
-
memcpy(&sixtyfour_bits, &sixtyfour_value, sizeof(sixtyfour_bits));
|
|
130
|
-
EXPECT_EQ(sixtyfour_f32, sixtyfour_bits) <<
|
|
131
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
132
|
-
"F16 = 0x" << std::setw(4) << sixtyfour_f16 << ", " <<
|
|
133
|
-
"F32(F16) = 0x" << std::setw(8) << sixtyfour_bits << ", " <<
|
|
134
|
-
"F32 = 0x" << std::setw(8) << sixtyfour_f32;
|
|
135
|
-
|
|
136
|
-
const float max_po2_value = fp16_ieee_to_fp32_value(max_po2_f16);
|
|
137
|
-
uint32_t max_po2_bits;
|
|
138
|
-
memcpy(&max_po2_bits, &max_po2_value, sizeof(max_po2_bits));
|
|
139
|
-
EXPECT_EQ(max_po2_f32, max_po2_bits) <<
|
|
140
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
141
|
-
"F16 = 0x" << std::setw(4) << max_po2_f16 << ", " <<
|
|
142
|
-
"F32(F16) = 0x" << std::setw(8) << max_po2_bits << ", " <<
|
|
143
|
-
"F32 = 0x" << std::setw(8) << max_po2_f32;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
TEST(FP16_IEEE_TO_FP32_VALUE, denormalized_powers_of_2) {
|
|
147
|
-
const uint16_t exp2_minus_15_f16 = UINT16_C(0x0200);
|
|
148
|
-
const uint16_t exp2_minus_16_f16 = UINT16_C(0x0100);
|
|
149
|
-
const uint16_t exp2_minus_17_f16 = UINT16_C(0x0080);
|
|
150
|
-
const uint16_t exp2_minus_18_f16 = UINT16_C(0x0040);
|
|
151
|
-
const uint16_t exp2_minus_19_f16 = UINT16_C(0x0020);
|
|
152
|
-
const uint16_t exp2_minus_20_f16 = UINT16_C(0x0010);
|
|
153
|
-
const uint16_t exp2_minus_21_f16 = UINT16_C(0x0008);
|
|
154
|
-
const uint16_t exp2_minus_22_f16 = UINT16_C(0x0004);
|
|
155
|
-
const uint16_t exp2_minus_23_f16 = UINT16_C(0x0002);
|
|
156
|
-
const uint16_t exp2_minus_24_f16 = UINT16_C(0x0001);
|
|
157
|
-
|
|
158
|
-
const uint32_t exp2_minus_15_f32 = UINT32_C(0x38000000);
|
|
159
|
-
const uint32_t exp2_minus_16_f32 = UINT32_C(0x37800000);
|
|
160
|
-
const uint32_t exp2_minus_17_f32 = UINT32_C(0x37000000);
|
|
161
|
-
const uint32_t exp2_minus_18_f32 = UINT32_C(0x36800000);
|
|
162
|
-
const uint32_t exp2_minus_19_f32 = UINT32_C(0x36000000);
|
|
163
|
-
const uint32_t exp2_minus_20_f32 = UINT32_C(0x35800000);
|
|
164
|
-
const uint32_t exp2_minus_21_f32 = UINT32_C(0x35000000);
|
|
165
|
-
const uint32_t exp2_minus_22_f32 = UINT32_C(0x34800000);
|
|
166
|
-
const uint32_t exp2_minus_23_f32 = UINT32_C(0x34000000);
|
|
167
|
-
const uint32_t exp2_minus_24_f32 = UINT32_C(0x33800000);
|
|
168
|
-
|
|
169
|
-
const float exp2_minus_15_value = fp16_ieee_to_fp32_value(exp2_minus_15_f16);
|
|
170
|
-
uint32_t exp2_minus_15_bits;
|
|
171
|
-
memcpy(&exp2_minus_15_bits, &exp2_minus_15_value, sizeof(exp2_minus_15_bits));
|
|
172
|
-
EXPECT_EQ(exp2_minus_15_f32, exp2_minus_15_bits) <<
|
|
173
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
174
|
-
"F16 = 0x" << std::setw(4) << exp2_minus_15_f16 << ", " <<
|
|
175
|
-
"F32(F16) = 0x" << std::setw(8) << exp2_minus_15_bits << ", " <<
|
|
176
|
-
"F32 = 0x" << std::setw(8) << exp2_minus_15_f32;
|
|
177
|
-
|
|
178
|
-
const float exp2_minus_16_value = fp16_ieee_to_fp32_value(exp2_minus_16_f16);
|
|
179
|
-
uint32_t exp2_minus_16_bits;
|
|
180
|
-
memcpy(&exp2_minus_16_bits, &exp2_minus_16_value, sizeof(exp2_minus_16_bits));
|
|
181
|
-
EXPECT_EQ(exp2_minus_16_f32, exp2_minus_16_bits) <<
|
|
182
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
183
|
-
"F16 = 0x" << std::setw(4) << exp2_minus_16_f16 << ", " <<
|
|
184
|
-
"F32(F16) = 0x" << std::setw(8) << exp2_minus_16_bits << ", " <<
|
|
185
|
-
"F32 = 0x" << std::setw(8) << exp2_minus_16_f32;
|
|
186
|
-
|
|
187
|
-
const float exp2_minus_17_value = fp16_ieee_to_fp32_value(exp2_minus_17_f16);
|
|
188
|
-
uint32_t exp2_minus_17_bits;
|
|
189
|
-
memcpy(&exp2_minus_17_bits, &exp2_minus_17_value, sizeof(exp2_minus_17_bits));
|
|
190
|
-
EXPECT_EQ(exp2_minus_17_f32, exp2_minus_17_bits) <<
|
|
191
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
192
|
-
"F16 = 0x" << std::setw(4) << exp2_minus_17_f16 << ", " <<
|
|
193
|
-
"F32(F16) = 0x" << std::setw(8) << exp2_minus_17_bits << ", " <<
|
|
194
|
-
"F32 = 0x" << std::setw(8) << exp2_minus_17_f32;
|
|
195
|
-
|
|
196
|
-
const float exp2_minus_18_value = fp16_ieee_to_fp32_value(exp2_minus_18_f16);
|
|
197
|
-
uint32_t exp2_minus_18_bits;
|
|
198
|
-
memcpy(&exp2_minus_18_bits, &exp2_minus_18_value, sizeof(exp2_minus_18_bits));
|
|
199
|
-
EXPECT_EQ(exp2_minus_18_f32, exp2_minus_18_bits) <<
|
|
200
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
201
|
-
"F16 = 0x" << std::setw(4) << exp2_minus_18_f16 << ", " <<
|
|
202
|
-
"F32(F16) = 0x" << std::setw(8) << exp2_minus_18_bits << ", " <<
|
|
203
|
-
"F32 = 0x" << std::setw(8) << exp2_minus_18_f32;
|
|
204
|
-
|
|
205
|
-
const float exp2_minus_19_value = fp16_ieee_to_fp32_value(exp2_minus_19_f16);
|
|
206
|
-
uint32_t exp2_minus_19_bits;
|
|
207
|
-
memcpy(&exp2_minus_19_bits, &exp2_minus_19_value, sizeof(exp2_minus_19_bits));
|
|
208
|
-
EXPECT_EQ(exp2_minus_19_f32, exp2_minus_19_bits) <<
|
|
209
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
210
|
-
"F16 = 0x" << std::setw(4) << exp2_minus_19_f16 << ", " <<
|
|
211
|
-
"F32(F16) = 0x" << std::setw(8) << exp2_minus_19_bits << ", " <<
|
|
212
|
-
"F32 = 0x" << std::setw(8) << exp2_minus_19_f32;
|
|
213
|
-
|
|
214
|
-
const float exp2_minus_20_value = fp16_ieee_to_fp32_value(exp2_minus_20_f16);
|
|
215
|
-
uint32_t exp2_minus_20_bits;
|
|
216
|
-
memcpy(&exp2_minus_20_bits, &exp2_minus_20_value, sizeof(exp2_minus_20_bits));
|
|
217
|
-
EXPECT_EQ(exp2_minus_20_f32, exp2_minus_20_bits) <<
|
|
218
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
219
|
-
"F16 = 0x" << std::setw(4) << exp2_minus_20_f16 << ", " <<
|
|
220
|
-
"F32(F16) = 0x" << std::setw(8) << exp2_minus_20_bits << ", " <<
|
|
221
|
-
"F32 = 0x" << std::setw(8) << exp2_minus_20_f32;
|
|
222
|
-
|
|
223
|
-
const float exp2_minus_21_value = fp16_ieee_to_fp32_value(exp2_minus_21_f16);
|
|
224
|
-
uint32_t exp2_minus_21_bits;
|
|
225
|
-
memcpy(&exp2_minus_21_bits, &exp2_minus_21_value, sizeof(exp2_minus_21_bits));
|
|
226
|
-
EXPECT_EQ(exp2_minus_21_f32, exp2_minus_21_bits) <<
|
|
227
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
228
|
-
"F16 = 0x" << std::setw(4) << exp2_minus_21_f16 << ", " <<
|
|
229
|
-
"F32(F16) = 0x" << std::setw(8) << exp2_minus_21_bits << ", " <<
|
|
230
|
-
"F32 = 0x" << std::setw(8) << exp2_minus_21_f32;
|
|
231
|
-
|
|
232
|
-
const float exp2_minus_22_value = fp16_ieee_to_fp32_value(exp2_minus_22_f16);
|
|
233
|
-
uint32_t exp2_minus_22_bits;
|
|
234
|
-
memcpy(&exp2_minus_22_bits, &exp2_minus_22_value, sizeof(exp2_minus_22_bits));
|
|
235
|
-
EXPECT_EQ(exp2_minus_22_f32, exp2_minus_22_bits) <<
|
|
236
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
237
|
-
"F16 = 0x" << std::setw(4) << exp2_minus_22_f16 << ", " <<
|
|
238
|
-
"F32(F16) = 0x" << std::setw(8) << exp2_minus_22_bits << ", " <<
|
|
239
|
-
"F32 = 0x" << std::setw(8) << exp2_minus_22_f32;
|
|
240
|
-
|
|
241
|
-
const float exp2_minus_23_value = fp16_ieee_to_fp32_value(exp2_minus_23_f16);
|
|
242
|
-
uint32_t exp2_minus_23_bits;
|
|
243
|
-
memcpy(&exp2_minus_23_bits, &exp2_minus_23_value, sizeof(exp2_minus_23_bits));
|
|
244
|
-
EXPECT_EQ(exp2_minus_23_f32, exp2_minus_23_bits) <<
|
|
245
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
246
|
-
"F16 = 0x" << std::setw(4) << exp2_minus_23_f16 << ", " <<
|
|
247
|
-
"F32(F16) = 0x" << std::setw(8) << exp2_minus_23_bits << ", " <<
|
|
248
|
-
"F32 = 0x" << std::setw(8) << exp2_minus_23_f32;
|
|
249
|
-
|
|
250
|
-
const float exp2_minus_24_value = fp16_ieee_to_fp32_value(exp2_minus_24_f16);
|
|
251
|
-
uint32_t exp2_minus_24_bits;
|
|
252
|
-
memcpy(&exp2_minus_24_bits, &exp2_minus_24_value, sizeof(exp2_minus_24_bits));
|
|
253
|
-
EXPECT_EQ(exp2_minus_24_f32, exp2_minus_24_bits) <<
|
|
254
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
255
|
-
"F16 = 0x" << std::setw(4) << exp2_minus_24_f16 << ", " <<
|
|
256
|
-
"F32(F16) = 0x" << std::setw(8) << exp2_minus_24_bits << ", " <<
|
|
257
|
-
"F32 = 0x" << std::setw(8) << exp2_minus_24_f32;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
TEST(FP16_IEEE_TO_FP32_VALUE, zero) {
|
|
261
|
-
const uint16_t positive_zero_f16 = UINT16_C(0x0000);
|
|
262
|
-
const uint16_t negative_zero_f16 = UINT16_C(0x8000);
|
|
263
|
-
|
|
264
|
-
const uint32_t positive_zero_f32 = UINT32_C(0x00000000);
|
|
265
|
-
const uint32_t negative_zero_f32 = UINT32_C(0x80000000);
|
|
266
|
-
|
|
267
|
-
const float positive_zero_value = fp16_ieee_to_fp32_value(positive_zero_f16);
|
|
268
|
-
uint32_t positive_zero_bits;
|
|
269
|
-
memcpy(&positive_zero_bits, &positive_zero_value, sizeof(positive_zero_bits));
|
|
270
|
-
EXPECT_EQ(positive_zero_f32, positive_zero_bits) <<
|
|
271
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
272
|
-
"F16 = 0x" << std::setw(4) << positive_zero_f16 << ", " <<
|
|
273
|
-
"F32(F16) = 0x" << std::setw(8) << positive_zero_bits << ", " <<
|
|
274
|
-
"F32 = 0x" << std::setw(8) << positive_zero_f32;
|
|
275
|
-
|
|
276
|
-
const float negative_zero_value = fp16_ieee_to_fp32_value(negative_zero_f16);
|
|
277
|
-
uint32_t negative_zero_bits;
|
|
278
|
-
memcpy(&negative_zero_bits, &negative_zero_value, sizeof(negative_zero_bits));
|
|
279
|
-
EXPECT_EQ(negative_zero_f32, negative_zero_bits) <<
|
|
280
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
281
|
-
"F16 = 0x" << std::setw(4) << negative_zero_f16 << ", " <<
|
|
282
|
-
"F32(F16) = 0x" << std::setw(8) << negative_zero_bits << ", " <<
|
|
283
|
-
"F32 = 0x" << std::setw(8) << negative_zero_f32;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
TEST(FP16_IEEE_TO_FP32_VALUE, infinity) {
|
|
287
|
-
const uint16_t positive_infinity_f16 = UINT16_C(0x7C00);
|
|
288
|
-
const uint16_t negative_infinity_f16 = UINT16_C(0xFC00);
|
|
289
|
-
|
|
290
|
-
const uint32_t positive_infinity_f32 = UINT32_C(0x7F800000);
|
|
291
|
-
const uint32_t negative_infinity_f32 = UINT32_C(0xFF800000);
|
|
292
|
-
|
|
293
|
-
const float positive_infinity_value = fp16_ieee_to_fp32_value(positive_infinity_f16);
|
|
294
|
-
uint32_t positive_infinity_bits;
|
|
295
|
-
memcpy(&positive_infinity_bits, &positive_infinity_value, sizeof(positive_infinity_bits));
|
|
296
|
-
EXPECT_EQ(positive_infinity_f32, positive_infinity_bits) <<
|
|
297
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
298
|
-
"F16 = 0x" << std::setw(4) << positive_infinity_f16 << ", " <<
|
|
299
|
-
"F32(F16) = 0x" << std::setw(8) << positive_infinity_bits << ", " <<
|
|
300
|
-
"F32 = 0x" << std::setw(8) << positive_infinity_f32;
|
|
301
|
-
|
|
302
|
-
const float negative_infinity_value = fp16_ieee_to_fp32_value(negative_infinity_f16);
|
|
303
|
-
uint32_t negative_infinity_bits;
|
|
304
|
-
memcpy(&negative_infinity_bits, &negative_infinity_value, sizeof(negative_infinity_bits));
|
|
305
|
-
EXPECT_EQ(negative_infinity_f32, negative_infinity_bits) <<
|
|
306
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
307
|
-
"F16 = 0x" << std::setw(4) << negative_infinity_f16 << ", " <<
|
|
308
|
-
"F32(F16) = 0x" << std::setw(8) << negative_infinity_bits << ", " <<
|
|
309
|
-
"F32 = 0x" << std::setw(8) << negative_infinity_f32;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
TEST(FP16_IEEE_TO_FP32_VALUE, positive_nan) {
|
|
313
|
-
using std::signbit;
|
|
314
|
-
using std::isnan;
|
|
315
|
-
for (uint16_t m = UINT16_C(1); m < UINT16_C(0x0400); m++) {
|
|
316
|
-
const uint16_t nan_f16 = UINT16_C(0x7C00) | m;
|
|
317
|
-
const float nan_f32 = fp16_ieee_to_fp32_value(nan_f16);
|
|
318
|
-
uint32_t nan_bits;
|
|
319
|
-
memcpy(&nan_bits, &nan_f32, sizeof(nan_bits));
|
|
320
|
-
|
|
321
|
-
/* Check if NaN */
|
|
322
|
-
EXPECT_TRUE(isnan(nan_f32)) <<
|
|
323
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
324
|
-
"F16 = 0x" << std::setw(4) << nan_f16 << ", " <<
|
|
325
|
-
"F32(F16) = 0x" << std::setw(8) << nan_bits;
|
|
326
|
-
|
|
327
|
-
/* Check sign */
|
|
328
|
-
EXPECT_EQ(signbit(nan_f32), 0) <<
|
|
329
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
330
|
-
"F16 = 0x" << std::setw(4) << nan_f16 << ", " <<
|
|
331
|
-
"F32(F16) = 0x" << std::setw(8) << nan_bits;
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
TEST(FP16_IEEE_TO_FP32_VALUE, negative_nan) {
|
|
336
|
-
using std::signbit;
|
|
337
|
-
using std::isnan;
|
|
338
|
-
for (uint16_t m = UINT16_C(1); m < UINT16_C(0x0400); m++) {
|
|
339
|
-
const uint16_t nan_f16 = UINT16_C(0xFC00) | m;
|
|
340
|
-
const float nan_f32 = fp16_ieee_to_fp32_value(nan_f16);
|
|
341
|
-
uint32_t nan_bits;
|
|
342
|
-
memcpy(&nan_bits, &nan_f32, sizeof(nan_bits));
|
|
343
|
-
|
|
344
|
-
/* Check if NaN */
|
|
345
|
-
EXPECT_TRUE(isnan(nan_f32)) <<
|
|
346
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
347
|
-
"F16 = 0x" << std::setw(4) << nan_f16 << ", " <<
|
|
348
|
-
"F32(F16) = 0x" << std::setw(8) << nan_bits;
|
|
349
|
-
|
|
350
|
-
/* Check sign */
|
|
351
|
-
EXPECT_EQ(signbit(nan_f32), 1) <<
|
|
352
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
353
|
-
"F16 = 0x" << std::setw(4) << nan_f16 << ", " <<
|
|
354
|
-
"F32(F16) = 0x" << std::setw(8) << nan_bits;
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
TEST(FP16_IEEE_TO_FP32_VALUE, positive_normalized_values) {
|
|
359
|
-
const uint32_t exponentBias = 15;
|
|
360
|
-
for (int32_t e = -14; e <= 15; e++) {
|
|
361
|
-
for (uint16_t h = 0; h < 0x0400; h++) {
|
|
362
|
-
const uint16_t fp16 = h + ((uint16_t) (e + exponentBias) << 10);
|
|
363
|
-
const uint32_t fp32 = fp16::normalizedValues[h] + ((uint32_t) e << 23);
|
|
364
|
-
const float value = fp16_ieee_to_fp32_value(fp16);
|
|
365
|
-
uint32_t bits;
|
|
366
|
-
memcpy(&bits, &value, sizeof(bits));
|
|
367
|
-
EXPECT_EQ(fp32, bits) <<
|
|
368
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
369
|
-
"F16 = 0x" << std::setw(4) << fp16 << ", " <<
|
|
370
|
-
"F32(F16) = 0x" << std::setw(8) << bits << ", " <<
|
|
371
|
-
"F32 = 0x" << std::setw(8) << fp32;
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
TEST(FP16_IEEE_TO_FP32_VALUE, negative_normalized_values) {
|
|
377
|
-
const uint32_t exponentBias = 15;
|
|
378
|
-
for (int32_t e = -14; e <= 15; e++) {
|
|
379
|
-
for (uint16_t h = 0; h < 0x0400; h++) {
|
|
380
|
-
const uint16_t fp16 = (h + ((uint16_t) (e + exponentBias) << 10)) ^ UINT16_C(0x8000);
|
|
381
|
-
const uint32_t fp32 = (fp16::normalizedValues[h] + ((uint32_t) e << 23)) ^ UINT32_C(0x80000000);
|
|
382
|
-
const float value = fp16_ieee_to_fp32_value(fp16);
|
|
383
|
-
uint32_t bits;
|
|
384
|
-
memcpy(&bits, &value, sizeof(bits));
|
|
385
|
-
EXPECT_EQ(fp32, bits) <<
|
|
386
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
387
|
-
"F16 = 0x" << std::setw(4) << fp16 << ", " <<
|
|
388
|
-
"F32(F16) = 0x" << std::setw(8) << bits << ", " <<
|
|
389
|
-
"F32 = 0x" << std::setw(8) << fp32;
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
TEST(FP16_IEEE_TO_FP32_VALUE, positive_denormalized_values) {
|
|
395
|
-
for (uint16_t h = 0; h < 0x0400; h++) {
|
|
396
|
-
const float value = fp16_ieee_to_fp32_value(h);
|
|
397
|
-
uint32_t bits;
|
|
398
|
-
memcpy(&bits, &value, sizeof(bits));
|
|
399
|
-
EXPECT_EQ(fp16::denormalizedValues[h], bits) <<
|
|
400
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
401
|
-
"F16 = 0x" << std::setw(4) << h << ", " <<
|
|
402
|
-
"F32(F16) = 0x" << std::setw(8) << bits << ", " <<
|
|
403
|
-
"F32 = 0x" << std::setw(8) << fp16::denormalizedValues[h];
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
TEST(FP16_IEEE_TO_FP32_VALUE, negative_denormalized_values) {
|
|
408
|
-
for (uint16_t h = 0; h < 0x0400; h++) {
|
|
409
|
-
const uint16_t fp16 = h ^ UINT16_C(0x8000);
|
|
410
|
-
const uint32_t fp32 = fp16::denormalizedValues[h] ^ UINT32_C(0x80000000);
|
|
411
|
-
const float value = fp16_ieee_to_fp32_value(fp16);
|
|
412
|
-
uint32_t bits;
|
|
413
|
-
memcpy(&bits, &value, sizeof(bits));
|
|
414
|
-
EXPECT_EQ(fp32, bits) <<
|
|
415
|
-
std::hex << std::uppercase << std::setfill('0') <<
|
|
416
|
-
"F16 = 0x" << std::setw(4) << fp16 << ", " <<
|
|
417
|
-
"F32(F16) = 0x" << std::setw(8) << bits << ", " <<
|
|
418
|
-
"F32 = 0x" << std::setw(8) << fp32;
|
|
419
|
-
}
|
|
420
|
-
}
|