From ab944af0f794033c0afd792eaf8a43d044a114b7 Mon Sep 17 00:00:00 2001 From: Stephane Letz Date: Wed, 12 Apr 2023 16:52:45 +0200 Subject: [PATCH] Updated interval library. --- compiler/interval/QUESTIONS.md | 2 -- compiler/interval/intervalAnd.cpp | 19 +++++++++++-------- compiler/interval/intervalOr.cpp | 3 +++ compiler/interval/intervalXor.cpp | 4 ++++ compiler/interval/interval_def.hh | 2 ++ 5 files changed, 20 insertions(+), 10 deletions(-) delete mode 100644 compiler/interval/QUESTIONS.md diff --git a/compiler/interval/QUESTIONS.md b/compiler/interval/QUESTIONS.md deleted file mode 100644 index 8073f6f105..0000000000 --- a/compiler/interval/QUESTIONS.md +++ /dev/null @@ -1,2 +0,0 @@ -* When storing measurements in order to measure the output precision, should we keep the NaNs? (ie make the insertion inside or outside the !std::isnan(z) test) -* In the binary function we should probably explicitly add the boundaries of the input intervals just as in the unary function \ No newline at end of file diff --git a/compiler/interval/intervalAnd.cpp b/compiler/interval/intervalAnd.cpp index 0beb659860..01d6c44dd4 100644 --- a/compiler/interval/intervalAnd.cpp +++ b/compiler/interval/intervalAnd.cpp @@ -139,7 +139,7 @@ interval interval_algebra::And(const interval& x, const interval& y) const if (x0 == x1) { int v = x0; // only element of interval x - while ((v & 1) == 0) // while we encounter zeroes at the lower end of v + while ((v & 1) == 0 and v != 0) // while we encounter zeroes at the lower end of v { v = v/2; precisionx++; @@ -151,7 +151,7 @@ interval interval_algebra::And(const interval& x, const interval& y) const if (y0 == y1) { int v = y0; // only element of interval y - while ((v & 1) == 0) // while we encounter zeroes at the lower end of v + while ((v & 1) == 0 and v != 0) // while we encounter zeroes at the lower end of v { v = v/2; precisiony++; @@ -163,11 +163,14 @@ interval interval_algebra::And(const interval& x, const interval& y) const void interval_algebra::testAnd() const { - analyzeBinaryMethod(10, 2000, "And", interval(256, 257), interval(12), myAnd, &interval_algebra::And); - analyzeBinaryMethod(10, 2000, "And", interval(-1000, -800), interval(12), myAnd, &interval_algebra::And); - analyzeBinaryMethod(10, 2000, "And", interval(-1000, -800), interval(12), myAnd, &interval_algebra::And); - analyzeBinaryMethod(10, 2000, "And", interval(-128, 128), interval(127), myAnd, &interval_algebra::And); - analyzeBinaryMethod(10, 2000, "And", interval(0, 1000), interval(63, 127), myAnd, &interval_algebra::And); - analyzeBinaryMethod(10, 2000, "And", interval(-1000, 1000), interval(63, 127), myAnd, &interval_algebra::And); + analyzeBinaryMethod(10, 2000, "And", interval(0, 257, 0), singleton(12), myAnd, &interval_algebra::And); + analyzeBinaryMethod(10, 2000, "And", interval(-1000, -800, 0), singleton(12), myAnd, &interval_algebra::And); + analyzeBinaryMethod(10, 2000, "And", interval(-1000, -800, 0), singleton(12), myAnd, &interval_algebra::And); + analyzeBinaryMethod(10, 2000, "And", interval(-128, 128, 0), singleton(127), myAnd, &interval_algebra::And); + analyzeBinaryMethod(10, 2000, "And", interval(0, 1000, 0), interval(63, 127), myAnd, &interval_algebra::And); + analyzeBinaryMethod(10, 2000, "And", interval(-1000, 1000, 0), interval(63, 127), myAnd, &interval_algebra::And); + analyzeBinaryMethod(10, 2000, "And", interval(10,20, 0), singleton(0), myAnd, &interval_algebra::And); + analyzeBinaryMethod(10, 2000, "And", singleton(0), interval(15, 25, 0), myAnd, &interval_algebra::And); + analyzeBinaryMethod(10, 2000, "And", singleton(0), singleton(0), myAnd, &interval_algebra::And); } } // namespace itv diff --git a/compiler/interval/intervalOr.cpp b/compiler/interval/intervalOr.cpp index 7de0249e93..8475d73415 100644 --- a/compiler/interval/intervalOr.cpp +++ b/compiler/interval/intervalOr.cpp @@ -81,5 +81,8 @@ void interval_algebra::testOr() const analyzeBinaryMethod(10, 20000, "Or", interval(-128, 128), interval(127), myOr, &interval_algebra::Or); analyzeBinaryMethod(10, 20000, "Or", interval(0, 1000), interval(63, 127), myOr, &interval_algebra::Or); analyzeBinaryMethod(10, 20000, "Or", interval(-1000, 1000), interval(63, 127), myOr, &interval_algebra::Or); + analyzeBinaryMethod(10, 2000, "Or", interval(10,20), interval(0), myOr, &interval_algebra::Or); + analyzeBinaryMethod(10, 2000, "Or", interval(0), interval(15, 25), myOr, &interval_algebra::Or); + analyzeBinaryMethod(10, 2000, "Or", interval(0), interval(0), myOr, &interval_algebra::Or); } } // namespace itv diff --git a/compiler/interval/intervalXor.cpp b/compiler/interval/intervalXor.cpp index a212f30eda..a03047cf1f 100644 --- a/compiler/interval/intervalXor.cpp +++ b/compiler/interval/intervalXor.cpp @@ -90,5 +90,9 @@ void interval_algebra::testXor() const analyzeBinaryMethod(10, 20000, "Xor", interval(-1000, 1000, lx(generator)), interval(63, 127, ly(generator)), myXor, &interval_algebra::Xor); analyzeBinaryMethod(10, 20000, "Xor", interval(-1000, 1000, lx(generator)), interval(63, 127, ly(generator)), myXor, &interval_algebra::Xor); + + analyzeBinaryMethod(10, 2000, "Xor", interval(10,20), interval(0), myXor, &interval_algebra::Xor); + analyzeBinaryMethod(10, 2000, "Xor", interval(0), interval(15, 25), myXor, &interval_algebra::Xor); + analyzeBinaryMethod(10, 2000, "Xor", interval(0), interval(0), myXor, &interval_algebra::Xor); } } // namespace itv diff --git a/compiler/interval/interval_def.hh b/compiler/interval/interval_def.hh index aaa5fe7eea..3936d60598 100644 --- a/compiler/interval/interval_def.hh +++ b/compiler/interval/interval_def.hh @@ -171,6 +171,8 @@ inline interval reunion(const interval& i, const interval& j) inline interval singleton(double x, int lsb=-24) { + if (x==0) return {0,0,0}; + int precision = lsb; while (floor(x*pow(2, -precision-1)) == x*pow(2, -precision-1) and x != 0)