changeset 1044:31f01931b781 cxx11

Move to using double rather than float for floating-point calculations (float only for storage); more build fixes
author Chris Cannam
date Mon, 09 Mar 2015 12:02:10 +0000
parents fe39581d249b
children 1a73618b0b67
files base/Clipboard.cpp base/Clipboard.h base/LogRange.cpp base/LogRange.h data/model/EditableDenseThreeDimensionalModel.cpp
diffstat 5 files changed, 52 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/base/Clipboard.cpp	Wed Mar 04 19:08:21 2015 +0000
+++ b/base/Clipboard.cpp	Mon Mar 09 12:02:10 2015 +0000
@@ -15,7 +15,7 @@
 
 #include "Clipboard.h"
 
-Clipboard::Point::Point(long frame, QString label) :
+Clipboard::Point::Point(sv_frame_t frame, QString label) :
     m_haveFrame(true),
     m_frame(frame),
     m_haveValue(false),
@@ -31,7 +31,7 @@
 {
 }
 
-Clipboard::Point::Point(long frame, float value, QString label) :
+Clipboard::Point::Point(sv_frame_t frame, float value, QString label) :
     m_haveFrame(true),
     m_frame(frame),
     m_haveValue(true),
@@ -47,7 +47,7 @@
 {
 }
 
-Clipboard::Point::Point(long frame, float value, int duration, QString label) :
+Clipboard::Point::Point(sv_frame_t frame, float value, sv_frame_t duration, QString label) :
     m_haveFrame(true),
     m_frame(frame),
     m_haveValue(true),
@@ -63,7 +63,7 @@
 {
 }
 
-Clipboard::Point::Point(long frame, float value, int duration, float level, QString label) :
+Clipboard::Point::Point(sv_frame_t frame, float value, sv_frame_t duration, float level, QString label) :
     m_haveFrame(true),
     m_frame(frame),
     m_haveValue(true),
@@ -120,14 +120,14 @@
     return m_haveFrame;
 }
 
-long
+sv_frame_t
 Clipboard::Point::getFrame() const
 {
     return m_frame;
 }
 
 Clipboard::Point
-Clipboard::Point::withFrame(long frame) const
+Clipboard::Point::withFrame(sv_frame_t frame) const
 {
     Point p(*this);
     p.m_haveFrame = true;
@@ -162,14 +162,14 @@
     return m_haveDuration;
 }
 
-int
+sv_frame_t
 Clipboard::Point::getDuration() const
 {
     return m_duration;
 }
 
 Clipboard::Point
-Clipboard::Point::withDuration(int duration) const
+Clipboard::Point::withDuration(sv_frame_t duration) const
 {
     Point p(*this);
     p.m_haveDuration = true;
@@ -231,14 +231,14 @@
     return m_haveReferenceFrame && (m_referenceFrame != m_frame);
 }
 
-long
+sv_frame_t
 Clipboard::Point::getReferenceFrame() const
 {
     return m_referenceFrame;
 }
 
 void
-Clipboard::Point::setReferenceFrame(long f) 
+Clipboard::Point::setReferenceFrame(sv_frame_t f) 
 {
     m_haveReferenceFrame = true;
     m_referenceFrame = f;
--- a/base/Clipboard.h	Wed Mar 04 19:08:21 2015 +0000
+++ b/base/Clipboard.h	Mon Mar 09 12:02:10 2015 +0000
@@ -19,30 +19,32 @@
 #include <QString>
 #include <vector>
 
+#include "BaseTypes.h"
+
 class Clipboard
 {
 public:
     class Point
     {
     public:
-        Point(long frame, QString label);
-        Point(long frame, float value, QString label);
-        Point(long frame, float value, int duration, QString label);
-        Point(long frame, float value, int duration, float level, QString label);
+        Point(sv_frame_t frame, QString label);
+        Point(sv_frame_t frame, float value, QString label);
+        Point(sv_frame_t frame, float value, sv_frame_t duration, QString label);
+        Point(sv_frame_t frame, float value, sv_frame_t duration, float level, QString label);
         Point(const Point &point);
         Point &operator=(const Point &point);
 
         bool haveFrame() const;
-        long getFrame() const;
-        Point withFrame(long frame) const;
+        sv_frame_t getFrame() const;
+        Point withFrame(sv_frame_t frame) const;
 
         bool haveValue() const;
         float getValue() const;
         Point withValue(float value) const;
         
         bool haveDuration() const;
-        int getDuration() const;
-        Point withDuration(int duration) const;
+        sv_frame_t getDuration() const;
+        Point withDuration(sv_frame_t duration) const;
         
         bool haveLabel() const;
         QString getLabel() const;
@@ -55,22 +57,22 @@
         bool haveReferenceFrame() const;
         bool referenceFrameDiffers() const; // from point frame
 
-        long getReferenceFrame() const;
-        void setReferenceFrame(long);
+        sv_frame_t getReferenceFrame() const;
+        void setReferenceFrame(sv_frame_t);
 
     private:
         bool m_haveFrame;
-        long m_frame;
+        sv_frame_t m_frame;
         bool m_haveValue;
         float m_value;
         bool m_haveDuration;
-        int m_duration;
+        sv_frame_t m_duration;
         bool m_haveLabel;
         QString m_label;
         bool m_haveLevel;
         float m_level;
         bool m_haveReferenceFrame;
-        long m_referenceFrame;
+        sv_frame_t m_referenceFrame;
     };
 
     Clipboard();
--- a/base/LogRange.cpp	Wed Mar 04 19:08:21 2015 +0000
+++ b/base/LogRange.cpp	Mon Mar 09 12:02:10 2015 +0000
@@ -21,7 +21,7 @@
 #include <cmath>
 
 void
-LogRange::mapRange(float &min, float &max, float logthresh)
+LogRange::mapRange(double &min, double &max, double logthresh)
 {
     if (min > max) std::swap(min, max);
     if (max == min) max = min + 1;
@@ -30,19 +30,19 @@
 
     if (min >= 0.f) {
 
-        max = log10f(max); // we know max != 0
+        max = log10(max); // we know max != 0
 
         if (min == 0.f) min = std::min(logthresh, max);
-        else min = log10f(min);
+        else min = log10(min);
 
 //        SVDEBUG << "LogRange::mapRange: positive: min = " << min << ", max = " << max << endl;
 
     } else if (max <= 0.f) {
         
-        min = log10f(-min); // we know min != 0
+        min = log10(-min); // we know min != 0
         
         if (max == 0.f) max = std::min(logthresh, min);
-        else max = log10f(-max);
+        else max = log10(-max);
         
         std::swap(min, max);
         
@@ -52,7 +52,7 @@
         
         // min < 0 and max > 0
         
-        max = log10f(std::max(max, -min));
+        max = log10(std::max(max, -min));
         min = std::min(logthresh, max);
 
 //        SVDEBUG << "LogRange::mapRange: spanning: min = " << min << ", max = " << max << endl;
@@ -61,21 +61,21 @@
     if (min == max) min = max - 1;
 }        
 
-float
-LogRange::map(float value, float thresh)
+double
+LogRange::map(double value, double thresh)
 {
     if (value == 0.f) return thresh;
-    return log10f(fabsf(value));
+    return log10(fabs(value));
 }
 
-float
-LogRange::unmap(float value)
+double
+LogRange::unmap(double value)
 {
-    return powf(10.0, value);
+    return pow(10.0, value);
 }
 
 static double
-sd(const std::vector<float> &values, int start, int n)
+sd(const std::vector<double> &values, int start, int n)
 {
     double sum = 0.f, mean = 0.f, variance = 0.f;
     for (int i = 0; i < n; ++i) {
@@ -91,7 +91,7 @@
 }
 
 bool
-LogRange::useLogScale(std::vector<float> values)
+LogRange::useLogScale(std::vector<double> values)
 {
     // Principle: Partition the data into two sets around the median;
     // calculate the standard deviation of each set; if the two SDs
--- a/base/LogRange.h	Wed Mar 04 19:08:21 2015 +0000
+++ b/base/LogRange.h	Mon Mar 09 12:02:10 2015 +0000
@@ -28,27 +28,27 @@
      * extents of the logarithmic range.  thresh is the minimum value
      * for the log range, to be used if the linear range spans zero.
      */
-    static void mapRange(float &min, float &max, float thresh = -10);
+    static void mapRange(double &min, double &max, double thresh = -10);
 
     /**
      * Map a value onto a logarithmic range.  This just means taking
      * the base-10 log of the absolute value, or using the threshold
      * value if the absolute value is zero.
      */
-    static float map(float value, float thresh = -10);
+    static double map(double value, double thresh = -10);
 
     /**
      * Map a value from the logarithmic range back again.  This just
      * means taking the value'th power of ten.
      */
-    static float unmap(float value);
+    static double unmap(double value);
 
     /**
      * Estimate whether a set of values would be more properly shown
      * using a logarithmic than a linear scale.  This is only ever
      * going to be a rough guess.
      */
-    static bool useLogScale(std::vector<float> values);
+    static bool useLogScale(std::vector<double> values);
 
 };
 
--- a/data/model/EditableDenseThreeDimensionalModel.cpp	Wed Mar 04 19:08:21 2015 +0000
+++ b/data/model/EditableDenseThreeDimensionalModel.cpp	Mon Mar 09 12:02:10 2015 +0000
@@ -27,6 +27,8 @@
 #include <cmath>
 #include <cassert>
 
+using std::vector;
+
 #include "system/System.h"
 
 EditableDenseThreeDimensionalModel::EditableDenseThreeDimensionalModel(sv_samplerate_t sampleRate,
@@ -445,15 +447,15 @@
 {
     QReadLocker locker(&m_lock);
 
-    QVector<float> sample;
-    QVector<int> n;
+    vector<double> sample;
+    vector<int> n;
     
     for (int i = 0; i < 10; ++i) {
         int index = i * 10;
         if (index < m_data.size()) {
             const Column &c = m_data.at(index);
-            while (c.size() > sample.size()) {
-                sample.push_back(0.f);
+            while (c.size() > int(sample.size())) {
+                sample.push_back(0.0);
                 n.push_back(0);
             }
             for (int j = 0; j < c.size(); ++j) {
@@ -464,11 +466,11 @@
     }
 
     if (sample.empty()) return false;
-    for (int j = 0; j < sample.size(); ++j) {
-        if (n[j]) sample[j] /= float(n[j]);
+    for (decltype(sample)::size_type j = 0; j < sample.size(); ++j) {
+        if (n[j]) sample[j] /= n[j];
     }
     
-    return LogRange::useLogScale(sample.toStdVector());
+    return LogRange::useLogScale(sample);
 }
 
 void