From 3663ca6c2d4c42c4a7bf6af4b2edf71dd8d10dd7 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Tue, 12 May 2015 13:10:23 -0700 Subject: 1356 - snapshot #2: floating point support I added one test to check that divide can return a float, then hacked at the rippling failures across the entire entire codebase until all tests pass. Now I need to look at the changes I made and see if there's a system to them, identify other places that I missed, and figure out the best way to cover all cases. I also need to show real rather than encoded values in the traces, but I can't use value() inside reagent methods because of the name clash with the member variable. So let's take a snapshot before we attempt any refactoring. This was non-trivial to get right. Even if I convince myself that I've gotten it right, I might back this all out if I can't easily *persuade others* that I've gotten it right. --- 024compare.cc | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) (limited to '024compare.cc') diff --git a/024compare.cc b/024compare.cc index 92d87e5c..c9d73170 100644 --- a/024compare.cc +++ b/024compare.cc @@ -9,13 +9,23 @@ case EQUAL: { vector& exemplar = ingredients.at(0); bool result = true; for (index_t i = 1; i < ingredients.size(); ++i) { - if (!equal(ingredients.at(i).begin(), ingredients.at(i).end(), exemplar.begin())) { +//? cerr << ingredients.at(i).at(0) << " <=> " << exemplar.at(0) << '\n'; //? 1 +//? cerr << value(ingredients.at(i).at(0)) << " <=> " << value(exemplar.at(0)) << '\n'; //? 1 + if (ingredients.at(i).size() != exemplar.size()) { result = false; break; } +//? if (!equal(ingredients.at(i).begin(), ingredients.at(i).end(), exemplar.begin())) + for (index_t j = 0; j < exemplar.size(); ++j) { + if (value(ingredients.at(i).at(j)) != value(exemplar.at(j))) { + result = false; + goto finish; + } + } } + finish: products.resize(1); - products.at(0).push_back(result); + products.at(0).push_back(result); // boolean must be a positive integer break; } @@ -70,12 +80,12 @@ case GREATER_THAN: { assert(ingredients.at(i).size() == 1); // scalar } for (index_t i = /**/1; i < ingredients.size(); ++i) { - if (ingredients.at(i-1).at(0) <= ingredients.at(i).at(0)) { + if (value(ingredients.at(i-1).at(0)) <= value(ingredients.at(i).at(0))) { result = false; } } products.resize(1); - products.at(0).push_back(result); + products.at(0).push_back(result); // boolean must be a positive integer break; } @@ -130,12 +140,12 @@ case LESSER_THAN: { assert(ingredients.at(i).size() == 1); // scalar } for (index_t i = /**/1; i < ingredients.size(); ++i) { - if (ingredients.at(i-1).at(0) >= ingredients.at(i).at(0)) { + if (value(ingredients.at(i-1).at(0)) >= value(ingredients.at(i).at(0))) { result = false; } } products.resize(1); - products.at(0).push_back(result); + products.at(0).push_back(result); // boolean must be a positive integer break; } @@ -190,12 +200,12 @@ case GREATER_OR_EQUAL: { assert(ingredients.at(i).size() == 1); // scalar } for (index_t i = /**/1; i < ingredients.size(); ++i) { - if (ingredients.at(i-1).at(0) < ingredients.at(i).at(0)) { + if (value(ingredients.at(i-1).at(0)) < value(ingredients.at(i).at(0))) { result = false; } } products.resize(1); - products.at(0).push_back(result); + products.at(0).push_back(result); // boolean must be a positive integer break; } @@ -264,12 +274,12 @@ case LESSER_OR_EQUAL: { assert(ingredients.at(i).size() == 1); // scalar } for (index_t i = /**/1; i < ingredients.size(); ++i) { - if (ingredients.at(i-1).at(0) > ingredients.at(i).at(0)) { + if (value(ingredients.at(i-1).at(0)) > value(ingredients.at(i).at(0))) { result = false; } } products.resize(1); - products.at(0).push_back(result); + products.at(0).push_back(result); // boolean must be a positive integer break; } -- cgit 1.4.1-2-gfad0