Wow, we were using long doubles before. I don't think we need that much precision for cave survey. In catch there is Approx() that should take care of floating point comparison correctly.
On Fri, Mar 9, 2018 at 11:30 AM Wookey <woo...@wookware.org> wrote: > A bit of research tells that using 'long double' causes 80-bit fp on x86 > (i386 and amd64), as opposed to the 64-bit IEE 754 fp representation used > on other platforms, which is what you get if you specify double. > > So I tried changing the angle.{cpp.h} code to use double instead of long > double. > > That doesn't fix the problrematic tests, but does cause another 43 to fail: > test cases: 8 | 3 passed | 5 failed > assertions: 202 | 155 passed | 47 failed > > They all fail equality tests, despite them clearly being 'equal > enough' for our purposes. > > e.g. > /home/wookey/dewalls-1.0.0+ds1/test/azimuthparsingtests.cpp:31: FAILED: > CHECK( WallsSurveyParser("5:4").azimuth(Angle::Degrees) == UAngle(5 + 4 > / 60.0, Angle::Degrees) ) > with expansion: > 5.06667 deg == 5.06667 deg > > I see that 'approx' is used in the codebase which you might hope would > get all this right, but clearly excessive precision is being used for > our purposes (cave survey data). > > I'm not sure how to fix this. > > I've done an upload in the meantime with the previous bodge of the > tests, and to fix another bug too and let the package migrate to > testing. But getting the codebase to do what we actually expect would > be good. > > This is the patch I used to try double for angles: > > Author: Wookey <woo...@debian.org> > Last-Update: 2018-03-09 > > --- dewalls-1.0.0+ds1.orig/src/angle.cpp > +++ dewalls-1.0.0+ds1/src/angle.cpp > @@ -3,13 +3,13 @@ > > namespace dewalls { > > -const long double PI = acosl(-1.0L); > -const long double DegreesToRadians = PI / 180.0L; > -const long double GradiansToRadians = PI / 200.0L; > -const long double MilsNATOToRadians = PI / 3200.0L; > -const long double RadiansToDegrees = 180.0L / PI; > -const long double RadiansToGradians = 200.0L / PI; > -const long double RadiansToMilsNATO = 3200.0L / PI; > +const double PI = acosl(-1.0L); > +const double DegreesToRadians = PI / 180.0L; > +const double GradiansToRadians = PI / 200.0L; > +const double MilsNATOToRadians = PI / 3200.0L; > +const double RadiansToDegrees = 180.0L / PI; > +const double RadiansToGradians = 200.0L / PI; > +const double RadiansToMilsNATO = 3200.0L / PI; > > QString Angle::Name("angle"); > > @@ -30,7 +30,7 @@ QString Angle::symbolFor(Unit unit) { > } > } > > -long double Angle::toBase(long double quantity, Unit fromUnit) { > +double Angle::toBase(double quantity, Unit fromUnit) { > switch (fromUnit) { > case Radians: > return quantity; > @@ -47,7 +47,7 @@ long double Angle::toBase(long double qu > } > } > > -long double Angle::fromBase(long double quantity, Unit toUnit) { > +double Angle::fromBase(double quantity, Unit toUnit) { > switch (toUnit) { > case Radians: > return quantity; > @@ -64,7 +64,7 @@ long double Angle::fromBase(long double > } > } > > -long double Angle::convert(long double quantity, Unit fromUnit, Unit > toUnit) { > +double Angle::convert(double quantity, Unit fromUnit, Unit toUnit) { > return fromBase(toBase(quantity, fromUnit), toUnit); > } > > --- dewalls-1.0.0+ds1.orig/src/angle.h > +++ dewalls-1.0.0+ds1/src/angle.h > @@ -21,9 +21,9 @@ public: > > static QString Name; > > - static long double toBase(long double quantity, Unit fromUnit); > - static long double fromBase(long double quantity, Unit toUnit); > - static long double convert(long double quantity, Unit fromUnit, Unit > toUnit); > + static double toBase(double quantity, Unit fromUnit); > + static double fromBase(double quantity, Unit toUnit); > + static double convert(double quantity, Unit fromUnit, Unit toUnit); > static QString symbolFor(Unit unit); > }; > > > > Wookey > -- > Principal hats: Linaro, Debian, Wookware, ARM > http://wookware.org/ > -- Phi|ip