diff options
author | vvvv <vvvv@yandex-team.com> | 2024-11-01 15:41:40 +0300 |
---|---|---|
committer | vvvv <vvvv@yandex-team.com> | 2024-11-01 15:55:52 +0300 |
commit | 3325f745e67f7f442790822b5c9c5e9996708be7 (patch) | |
tree | f7318d68bbe8990092715436444b05297ce35777 /yql/essentials/utils/fp_bits_ut.cpp | |
parent | 6dce3f1c71786f2694b73b1a5155efc58f4557dd (diff) | |
download | ydb-3325f745e67f7f442790822b5c9c5e9996708be7.tar.gz |
Moved yql/utils YQL-19206
Также была выделена жирная зависимость из yql/utils в yql/utils/network, в результате library/cpp/getopt была добавлена явно в те проекты, которые ее ранее наследовали, а не указывали явно
commit_hash:36aa4c41f807b4cbbf70a3ed7ac0a1a5079bb75d
Diffstat (limited to 'yql/essentials/utils/fp_bits_ut.cpp')
-rw-r--r-- | yql/essentials/utils/fp_bits_ut.cpp | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/yql/essentials/utils/fp_bits_ut.cpp b/yql/essentials/utils/fp_bits_ut.cpp new file mode 100644 index 0000000000..d6d94b56f4 --- /dev/null +++ b/yql/essentials/utils/fp_bits_ut.cpp @@ -0,0 +1,105 @@ +#include "fp_bits.h" +#include <library/cpp/testing/unittest/registar.h> + +#include <util/system/valgrind.h> + +namespace NYql { + +namespace { +template <typename T> +void CanonizeFpBitsTest() { + enum EValues { + Zero, + MZero, + One, + Half, + Two, + PMin, + PMax, + DNorm, + PInf, + NInf, + QNan, + SNan, + INan, + Max + }; + + T values[EValues::Max]; + T newValues[EValues::Max]; + int valuesClass[EValues::Max]; + values[Zero] = T(0); + values[MZero] = -values[Zero]; + values[One] = T(1); + values[Half] = values[One] / 2; + values[Two] = values[One] * 2; + values[PMin] = std::numeric_limits<T>::min(); + values[DNorm] = values[PMin] / 2; + values[PMax] = std::numeric_limits<T>::max(); + values[PInf] = std::numeric_limits<T>::infinity(); + values[NInf] = -std::numeric_limits<T>::infinity(); + values[QNan] = std::numeric_limits<T>::quiet_NaN(); + values[SNan] = std::numeric_limits<T>::signaling_NaN(); + values[INan] = std::numeric_limits<T>::infinity() / std::numeric_limits<T>::infinity(); + + for (int v = Zero; v < Max; ++v) { + int cls; + if (v <= MZero) { + cls = FP_ZERO; + } else if (v < DNorm) { + cls = FP_NORMAL; + } else if (v == DNorm) { + cls = FP_SUBNORMAL; + } else if (v < QNan) { + cls = FP_INFINITE; + } else { + cls = FP_NAN; + } + + valuesClass[v] = cls; + } + + for (int v = Zero; v < Max; ++v) { + UNIT_ASSERT_VALUES_EQUAL(std::fpclassify(values[v]), valuesClass[v]); + } + + for (int v = Zero; v < Max; ++v) { + newValues[v] = values[v]; + CanonizeFpBits<T>(&newValues[v]); + } + + for (int v = Zero; v < Max; ++v) { + UNIT_ASSERT_VALUES_EQUAL(std::fpclassify(newValues[v]), valuesClass[v]); + } + + for (int v = Zero; v < Max; ++v) { + int originalV = v; + if (v == MZero) { + originalV = Zero; + } else if (v >= QNan) { + originalV = QNan; + } + + UNIT_ASSERT(std::memcmp((const void*)&newValues[v], (const void*)&values[originalV], std::min(size_t(10), sizeof(T))) == 0); + } +} +} + +Y_UNIT_TEST_SUITE(TFpBits) { + Y_UNIT_TEST(CanonizeFloat) { + CanonizeFpBitsTest<float>(); + } + + Y_UNIT_TEST(CanonizeDouble) { + CanonizeFpBitsTest<double>(); + } + + Y_UNIT_TEST(CanonizeLongDouble) { + if (NValgrind::ValgrindIsOn()) { + return; // TODO KIKIMR-3431 + } + CanonizeFpBitsTest<long double>(); + } +} + +} |