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/
signature.asc
Description: PGP signature