[libc-commits] [libc] [libc][test] make `str_to_float_comparison_test` independent of C++ headers. (PR #133978)
Mikhail R. Gadelha via libc-commits
libc-commits at lists.llvm.org
Tue Apr 8 14:35:45 PDT 2025
================
@@ -54,120 +69,169 @@ static inline uint64_t fastHexToU64(const char *inStr) {
return result;
}
-int checkFile(char *inputFileName, int *totalFails, int *totalBitDiffs,
- int *detailedBitDiffs, int *total) {
- int32_t curFails = 0; // Only counts actual failures, not bitdiffs.
- int32_t curBitDiffs = 0; // A bitdiff is when the expected result and actual
- // result are off by +/- 1 bit.
- std::string line;
- std::string num;
-
- std::ifstream fileStream(inputFileName, std::ifstream::in);
+static void parseLine(char *line, ParseResult &parseResult, int32_t &curFails,
+ int32_t &curBitDiffs) {
- if (!fileStream.is_open()) {
- std::cout << "file '" << inputFileName << "' failed to open. Exiting.\n";
- return 1;
+ if (line[0] == '#') {
+ return;
}
- while (getline(fileStream, line)) {
- if (line[0] == '#') {
- continue;
- }
- *total = *total + 1;
- uint32_t expectedFloatRaw;
- uint64_t expectedDoubleRaw;
+ parseResult.total += 1;
+ uint32_t expectedFloatRaw;
+ uint64_t expectedDoubleRaw;
- expectedFloatRaw = fastHexToU32(line.c_str() + 5);
- expectedDoubleRaw = fastHexToU64(line.c_str() + 14);
- num = line.substr(31);
+ expectedFloatRaw = fastHexToU32(line + 5);
+ expectedDoubleRaw = fastHexToU64(line + 14);
- float floatResult = strtof(num.c_str(), nullptr);
+ char *num = line + 31;
- double doubleResult = strtod(num.c_str(), nullptr);
+ float floatResult = LIBC_NAMESPACE::strtof(num, nullptr);
- uint32_t floatRaw = *(uint32_t *)(&floatResult);
+ double doubleResult = LIBC_NAMESPACE::strtod(num, nullptr);
- uint64_t doubleRaw = *(uint64_t *)(&doubleResult);
+ uint32_t floatRaw = LIBC_NAMESPACE::cpp::bit_cast<uint32_t>(floatResult);
- if (!(expectedFloatRaw == floatRaw)) {
- if (expectedFloatRaw == floatRaw + 1 ||
- expectedFloatRaw == floatRaw - 1) {
- curBitDiffs++;
- if (expectedFloatRaw == floatRaw + 1) {
- detailedBitDiffs[0] = detailedBitDiffs[0] + 1; // float low
- } else {
- detailedBitDiffs[1] = detailedBitDiffs[1] + 1; // float high
- }
+ uint64_t doubleRaw = LIBC_NAMESPACE::cpp::bit_cast<uint64_t>(doubleResult);
+
+ if (!(expectedFloatRaw == floatRaw)) {
+ if (expectedFloatRaw == floatRaw + 1 || expectedFloatRaw == floatRaw - 1) {
+ curBitDiffs++;
+ if (expectedFloatRaw == floatRaw + 1) {
+ parseResult.detailedBitDiffs[0] =
+ parseResult.detailedBitDiffs[0] + 1; // float low
} else {
- curFails++;
- }
- if (curFails + curBitDiffs < 10) {
- std::cout << "Float fail for '" << num << "'. Expected " << std::hex
- << expectedFloatRaw << " but got " << floatRaw << "\n"
- << std::dec;
+ parseResult.detailedBitDiffs[1] =
+ parseResult.detailedBitDiffs[1] + 1; // float high
}
+ } else {
+ curFails++;
}
+ if (curFails + curBitDiffs < 10) {
+ LIBC_NAMESPACE::printf("Float fail for '%s'. Expected %x but got %x\n",
+ num, expectedFloatRaw, floatRaw);
+ }
+ }
- if (!(expectedDoubleRaw == doubleRaw)) {
- if (expectedDoubleRaw == doubleRaw + 1 ||
- expectedDoubleRaw == doubleRaw - 1) {
- curBitDiffs++;
- if (expectedDoubleRaw == doubleRaw + 1) {
- detailedBitDiffs[2] = detailedBitDiffs[2] + 1; // double low
- } else {
- detailedBitDiffs[3] = detailedBitDiffs[3] + 1; // double high
- }
+ if (!(expectedDoubleRaw == doubleRaw)) {
+ if (expectedDoubleRaw == doubleRaw + 1 ||
+ expectedDoubleRaw == doubleRaw - 1) {
+ curBitDiffs++;
+ if (expectedDoubleRaw == doubleRaw + 1) {
+ parseResult.detailedBitDiffs[2] =
+ parseResult.detailedBitDiffs[2] + 1; // double low
} else {
- curFails++;
- }
- if (curFails + curBitDiffs < 10) {
- std::cout << "Double fail for '" << num << "'. Expected " << std::hex
- << expectedDoubleRaw << " but got " << doubleRaw << "\n"
- << std::dec;
+ parseResult.detailedBitDiffs[3] =
+ parseResult.detailedBitDiffs[3] + 1; // double high
}
+ } else {
+ curFails++;
}
+ if (curFails + curBitDiffs < 10) {
+ LIBC_NAMESPACE::printf("Double fail for '%s'. Expected %lx but got %lx\n",
+ num, expectedDoubleRaw, doubleRaw);
+ }
+ }
+}
+
+ParseStatus checkBuffer(ParseResult &parseResult) {
+ constexpr const char *lines[6] = {
----------------
mikhailramalho wrote:
constexpr variables should be capitalized as per https://libc.llvm.org/contributing.html
https://github.com/llvm/llvm-project/pull/133978
More information about the libc-commits
mailing list