2017-07-15 21 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()它包含真正的最小值。