2017-07-15 51 views
0

我创建了一个具有限制器的简单步进控制器。使用限制器创建步进控制器

它似乎一般运作良好。但是,如果我尝试使限制器的范围从numeric_limits<float>::min()numeric_limits<float>::max(),则当该值变为负值时,它无法正常工作。

这是我的完整测试代码。

#include <iostream> 

using namespace std; 

class Stepper { 

public: 

    Stepper(float from, float to, float value, float interval){ //limited range 

     mFrom = from; 
     mTo = to; 
     mValue = value; 
     mInterval = interval; 
    } 
    Stepper(float value, float interval){ //limitless range version 

     mFrom = numeric_limits<float>::min(); 
     mTo = numeric_limits<float>::max(); 
     mValue = value; 
     mInterval = interval; 
    } 

    float getCurrentValue() { 

     return mValue; 
    } 
    float getDecreasedValue() { 

     if (mFrom < mTo) 
      mValue -= mInterval; 
     else 
      mValue += mInterval; 

     mValue = clamp(mValue, min(mFrom, mTo), max(mFrom, mTo)); 
     return mValue; 
    } 
    float getIncreasedValue() { 

     if (mFrom < mTo) 
      mValue += mInterval; 
     else 
      mValue -= mInterval; 

     mValue = clamp(mValue, min(mFrom, mTo), max(mFrom, mTo)); 
     return mValue; 
    } 

private: 

    float clamp(float value, float min, float max) { 
     return value < min ? min : value > max ? max : value; 
    } 
    float mFrom, mTo, mValue, mInterval; 
}; 

int main(int argc, const char * argv[]) { 

    bool shouldQuit = false; 

// Stepper stepper(-3, 3, 0, 1); //this works 

    Stepper stepper(0, 1); //this doesn't work when the value becomes negative 


    cout << "step : " << stepper.getCurrentValue() << endl; 

    while (!shouldQuit) { 

     string inputStr; 
     cin >> inputStr; 

     if (inputStr == "-") //type in '-' decrease the step 
      cout << "step : " << stepper.getDecreasedValue() << endl; 
     else if (inputStr == "+") //type in '+' increase the step 
      cout << "step : " << stepper.getIncreasedValue() << endl; 
     else if (inputStr == "quit") 
      shouldQuit = true; 
    } 
    return 0; 
} 

我的类的构造需要4个参数是

  1. 最小有限值(这也可以是最大值)
  2. 最大限定值(这也可以是最小的)
  3. 初始值
  4. 步骤间隔

此外,构造只能取2个参数是

  1. 初始值
  2. 步骤

此情况下的时间间隔,限制器的范围从numeric_limits<float>::min()numeric_limits<float>::max()

但是在这种情况下,如果该值变为负值,则返回1.17549e-38,该值与numeric_limits<float>::min()的值相同。

可以解决这个问题吗? 任何意见或指导将不胜感激!

回答

1

在我看来,min()有一个不幸的名字。它的值是最小的,正的,标准化的浮点数。

改为使用lowest()它包含真正的最小值。