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/

Attachment: signature.asc
Description: PGP signature

Reply via email to