Prechádzať zdrojové kódy

adding optional float128 support

Nicolas Winkler 4 rokov pred
rodič
commit
e11e0c4697

+ 2 - 0
include/Almond.h

@@ -77,6 +77,8 @@ public:
     void submitBackgroundTask(BackgroundTask* task);
     void stopBackgroundTask();
 
+    void closeEvent(QCloseEvent* ce) override;
+
     bool eventFilter(QObject *target, QEvent *event);
 
     void submenuOK(int smIndex);

+ 1 - 1
include/FractalWidgetUtils.h

@@ -119,7 +119,7 @@ public:
 
     void run() override;
 signals:
-    void done(int level, GridIndex i, GridIndex j, Bitmap<float>* bmp);
+    void done(int level, GridIndex i, GridIndex j, int calcState, Bitmap<float>* bmp);
     void failed(int level, GridIndex i, GridIndex j, QString err);
 };
 

+ 1 - 1
include/FractalZoomWidget.h

@@ -62,7 +62,7 @@ public slots:
     void setCurrentLevel(int level);
     void notFinished(int level, GridIndex i, GridIndex j);
     void jobFailed(int level, GridIndex i, GridIndex j);
-    void redirect(int level, GridIndex i, GridIndex j, Bitmap<float>* bmp);
+    void redirect(int level, GridIndex i, GridIndex j, int calcState, Bitmap<float>* bmp);
 signals:
     void done(int level, GridIndex i, GridIndex j, Bitmap<float>* bmp);
 };

+ 4 - 5
libmandel/include/Types.h

@@ -12,8 +12,8 @@
 
 #ifdef WITH_BOOST
 #   include <boost/multiprecision/cpp_bin_float.hpp>
-#   if defined(__GNUC__) || defined(__INTEL_COMPILER)
-//#       include <boost/multiprecision/float128.hpp>
+#   if (defined(__GNUC__) || defined(__INTEL_COMPILER)) && defined(WITH_QUADMATH)
+#       include <boost/multiprecision/float128.hpp>
 #   endif
 #   include <boost/multiprecision/cpp_int.hpp>
 #   include <boost/functional/hash.hpp>
@@ -29,9 +29,8 @@
 namespace mnd
 {
 
-
 #ifdef WITH_BOOST
-#   if 0//defined(__GNUC__) || defined(__INTEL_COMPILER)
+#   if (defined(__GNUC__) || defined(__INTEL_COMPILER)) && defined(WITH_QUADMATH)
     using Float128 = boost::multiprecision::float128;
 #   else
     using Float128 = boost::multiprecision::cpp_bin_float_quad;
@@ -53,7 +52,7 @@ namespace mnd
 
     using Float256 = boost::multiprecision::number<
         boost::multiprecision::backends::cpp_bin_float<
-            240, boost::multiprecision::backends::digit_base_2, void, boost::int16_t, -16382, 16383>,
+            237, boost::multiprecision::backends::digit_base_2, void, boost::int32_t, -262142, 262143>,
             boost::multiprecision::et_off>;
 
     //using Float256 = long double;

+ 2 - 2
libmandel/src/Generators.cpp

@@ -137,9 +137,9 @@ namespace mnd
         case Precision::HEX_DOUBLE:
             return "hex-double";
         case Precision::FLOAT128:
-            return "float128";
+            return "IEEE 754 128-bit float";
         case Precision::FLOAT256:
-            return "float256";
+            return "IEEE 754 256-bit float";
         case Precision::FLOAT512:
             return "float512";
         case Precision::FIXED64:

+ 18 - 0
src/Almond.cpp

@@ -132,6 +132,24 @@ void Almond::stopBackgroundTask(void)
     stoppingBackgroundTasks = true;
 }
 
+
+void Almond::closeEvent(QCloseEvent* ce)
+{
+    Q_UNUSED(ce);
+    if (!this->backgroundTasks.waitForDone(1)) {
+        int answer = QMessageBox::question(this, tr("Running Tasks"),
+                tr("There are unfinished background tasks. Do you really want to quit?"),
+                                QMessageBox::Yes | QMessageBox::No);
+        if (answer == QMessageBox::Yes) {
+            ce->accept();
+        }
+        else {
+            ce->ignore();
+        }
+    }
+}
+
+
 bool Almond::eventFilter(QObject *target, QEvent *event)
 {
     if (event->type() == QEvent::KeyPress) {

+ 1 - 1
src/FractalWidgetUtils.cpp

@@ -101,7 +101,7 @@ void CalcJob::run(void)
     mi.bWidth = mi.bHeight = FractalZoomWidget::chunkSize;
     try {
         generator->generate(mi, f.pixels.get());
-        emit done(level, i, j, new Bitmap<float>(std::move(f)));
+        emit done(level, i, j, calcState, new Bitmap<float>(std::move(f)));
     }
     catch(std::exception& ex) {
         emit failed(level, i, j, ex.what());

+ 2 - 2
src/FractalZoomWidget.cpp

@@ -130,12 +130,12 @@ void Calcer::jobFailed(int level, GridIndex i, GridIndex j)
 }
 
 
-void Calcer::redirect(int level, GridIndex i, GridIndex j, Bitmap<float>* bmp)
+void Calcer::redirect(int level, GridIndex i, GridIndex j, int calcState, Bitmap<float>* bmp)
 {
     jobsMutex.lock();
     jobs.erase({ level, i, j });
     jobsMutex.unlock();
-    if (this->calcState == calcState) { // TODO remove invalid results correctly
+    if (this->calcState == calcState) {
         emit done(level, i, j, bmp);
     }
     else {