2017-07-15 9 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; 
} 

マイクラスのコンストラクタは、最小制限された値(これも最大であることができる)

  • 最大限られた値(これも最小とすることができる)
  • 初期

    1. ている4つの引数を必要とします値
    2. ステップ間隔

    また、コンストラクタは

    1. のみ2引数初期値
    2. ステップの間隔

    このケースを取ることができ、リミッタnumeric_limits<float>::min()からnumeric_limits<float>::max()の範囲。

    この場合、値が負になると1.17549e-38が返され、numeric_limits<float>::min()と同じ値になります。

    これを修正することは可能ですか? アドバイスやガイダンスをいただければ幸いです!

  • 答えて

    1

    私の意見では、min()は残念な名前です。その値は最小、正の、正規化された浮動小数点数です。

    代わりにlowest()を使用してください。実際の最小値が含まれています。

    関連する問題