diff --git a/.github/workflows/alpine.yml b/.github/workflows/alpine.yml index 459008a..7c82a49 100644 --- a/.github/workflows/alpine.yml +++ b/.github/workflows/alpine.yml @@ -1,27 +1,47 @@ name: Alpine Linux -'on': +on: - push - pull_request + jobs: - ubuntu-build: + build: + name: Build on Alpine ${{ matrix.arch }} runs-on: ubuntu-latest + strategy: + matrix: + arch: + - x86_64 + - x86 + - aarch64 + - armv7 + - ppc64le + - riscv64 steps: - - uses: actions/checkout@v3 - - name: start docker + - name: Checkout repository + uses: actions/checkout@v1 + + - name: Install latest Alpine Linux for ${{ matrix.arch }} + uses: jirutka/setup-alpine@v1 + with: + arch: ${{ matrix.arch }} + branch: ${{ matrix.arch == 'riscv64' && 'edge' || 'latest-stable' }} + packages: > + build-base + cmake + g++ + linux-headers + git + bash + build-base + - name: Prepare run: | - docker run -w /src -dit --name alpine -v $PWD:/src alpine:latest - echo 'docker exec alpine "$@";' > ./alpine.sh - chmod +x ./alpine.sh - - name: install packages + cmake -DFASTFLOAT_TEST=ON -B build + shell: alpine.sh {0} + - name: Build run: | - ./alpine.sh apk update - ./alpine.sh apk add build-base cmake g++ linux-headers git bash - - name: cmake + cmake --build build + shell: alpine.sh {0} + - name: Test run: | - ./alpine.sh cmake -DFASTFLOAT_TEST=ON -B build_for_alpine - - name: build - run: | - ./alpine.sh cmake --build build_for_alpine - - name: test - run: | - ./alpine.sh bash -c "cd build_for_alpine && ctest -R basictest" + ctest --test-dir build -R basictest + shell: alpine.sh {0} diff --git a/include/fast_float/parse_number.h b/include/fast_float/parse_number.h index 2493b02..3284443 100644 --- a/include/fast_float/parse_number.h +++ b/include/fast_float/parse_number.h @@ -66,6 +66,10 @@ from_chars_result parse_infnan(const char *first, const char *last, T &value) n * Credit : @mwalcott3 */ fastfloat_really_inline bool rounds_to_nearest() noexcept { + // https://lemire.me/blog/2020/06/26/gcc-not-nearest/ +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0) + return false; +#endif // See // A fast function to check your floating-point rounding mode // https://lemire.me/blog/2022/11/16/a-fast-function-to-check-your-floating-point-rounding-mode/ diff --git a/tests/basictest.cpp b/tests/basictest.cpp index 8bdd4df..433a9b5 100644 --- a/tests/basictest.cpp +++ b/tests/basictest.cpp @@ -132,7 +132,9 @@ TEST_CASE("rounds_to_nearest") { fesetround(FE_TONEAREST); std::cout << "FE_TONEAREST: fmin + 1.0f = " << iHexAndDec(fmin + 1.0f) << " 1.0f - fmin = " << iHexAndDec(1.0f - fmin) << std::endl; CHECK(fegetround() == FE_TONEAREST); +#if (FLT_EVAL_METHOD == 1) || (FLT_EVAL_METHOD == 0) CHECK(fast_float::detail::rounds_to_nearest() == true); +#endif } TEST_CASE("parse_zero") {