Generators.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include "Generators.h"
  2. #include <cstdio>
  3. using mnd::Generator;
  4. using mnd::AdaptiveGenerator;
  5. Generator::~Generator(void)
  6. {
  7. }
  8. mnd::Real Generator::getPrecision(void) const
  9. {
  10. return precision;
  11. }
  12. AdaptiveGenerator::AdaptiveGenerator(void) :
  13. Generator{ 0.0 }
  14. {
  15. }
  16. AdaptiveGenerator::AdaptiveGenerator(Generator* floatGen, Generator* doubleGen) :
  17. AdaptiveGenerator{}
  18. {
  19. generators.insert({ 0.0000001, floatGen });
  20. generators.insert({ 0.0, doubleGen });
  21. }
  22. /*
  23. AdaptiveGenerator::AdaptiveGenerator(Generator* floatGen, Generator* doubleGen, Generator* quadGen)
  24. {
  25. generators.insert({ 0.0000001, floatGen });
  26. generators.insert({ 5.0e-16, doubleGen });
  27. generators.insert({ Real("1.0e-28"), quadGen });
  28. }*/
  29. void AdaptiveGenerator::addGenerator(const mnd::Real& precision, mnd::Generator& generator)
  30. {
  31. generators.insert({ precision, &generator });
  32. }
  33. void AdaptiveGenerator::addGenerator(mnd::Precision p, Generator& generator)
  34. {
  35. generators.insert({ mnd::getPrecision(p), &generator });
  36. }
  37. void AdaptiveGenerator::generate(const mnd::MandelInfo& info, float* data)
  38. {
  39. Real pixelW = info.view.width / info.bWidth;
  40. Real pixelH = info.view.height / info.bHeight;
  41. Real neededPrecision = pixelW < pixelH ? pixelW : pixelH;
  42. //Generator* toUse = nullptr;
  43. auto firstSmaller = generators.lower_bound(neededPrecision);
  44. if (firstSmaller != generators.end()) {
  45. //printf("use generator with precision: %s\n", mnd::toString(firstSmaller->first).c_str());
  46. //printf("gen: %p\n", firstSmaller->second);fflush(stdout);
  47. firstSmaller->second->generate(info, data);
  48. }
  49. else {
  50. for (long s = 0; s < info.bWidth * info.bHeight; s++) {
  51. data[s] = 0.0;
  52. }
  53. }
  54. return;
  55. /*
  56. int i = 0;
  57. for (auto [thresh, gen] : generators) {
  58. ++i;
  59. if (neededPrecision > thresh) {
  60. toUse = gen;
  61. }
  62. }
  63. if (toUse != nullptr) {
  64. toUse->generate(info, data);
  65. }
  66. else {
  67. for (long s = 0; s < info.bWidth * info.bHeight; s++) {
  68. data[s] = 0.0;
  69. }
  70. }*/
  71. }
  72. namespace mnd
  73. {
  74. Real getPrecision(Precision p)
  75. {
  76. static const std::map<Precision, Real> precs {
  77. { Precision::FLOAT, getPrecision<float>() },
  78. { Precision::DOUBLE, getPrecision<double>() },
  79. { Precision::DOUBLE_DOUBLE, Real("1.0e-29") },
  80. { Precision::QUAD_DOUBLE, Real("1.0e-56") },
  81. { Precision::FIXED128, Real("1.317e-29") },
  82. { Precision::FLOAT256, Real("1.0e-58") },
  83. { Precision::INF_PREC, Real(0.0) },
  84. };
  85. return precs.at(p);
  86. }
  87. template<>
  88. Real getPrecision<float>() {
  89. return Real("1.0e-7");
  90. }
  91. template<>
  92. Real getPrecision<double>() {
  93. return Real("1.0e-15");
  94. }
  95. template<>
  96. Real getPrecision<DoubleDouble>() {
  97. return Real("1.0e-29");
  98. }
  99. template<>
  100. Real getPrecision<QuadDouble>() {
  101. return Real("1.0e-56");
  102. }
  103. template<>
  104. Real getPrecision<Fixed128>() {
  105. return Real("1.5e-29");
  106. }
  107. }