我在尋找最簡潔和一般的實現以下功能:最簡潔的實現與環繞溢出浮點約束功能的
float Constrain(float value, float min, float max);
凡約束()範圍內的[min, float)
界定value
。即,範圍包括最小值,但不包括max
和values
大於max
或小於min
環繞一圈。也就是說,以類似的方式整數溢出/下溢。
功能應通過以下測試:
Constrain( 0.0, 0.0, 10.0) == 0.0
Constrain(10.0, 0.0, 10.0) == 0.0
Constrain( 5.0, 0.0, 10.0) == 5.0
Constrain(15.0, 0.0, 10.0) == 5.0
Constrain(-1.0, 0.0, 10.0) == 9.0
Constrain(-15.0, 0.0, 10.0) == 5.0
Constrain( 0.0, -5.0, 5.0) == 0.0
Constrain( 5.0, -5.0, 5.0) == -5.0
Constrain( 0.0, -5.0, 5.0) == 0.0
Constrain(10.0, -5.0, 5.0) == 0.0
Constrain(-6.0, -5.0, 5.0) == 4.0
Constrain(-10.0, -5.0, 5.0) == 0.0
Constrain(24.0, -5.0, 5.0) == 4.0
Constrain( 0.0, -5.0, 0.0) == -5.0
Constrain( 5.0, -5.0, 0.0) == -5.0
Constrain(10.0, -5.0, 0.0) == -5.0
Constrain(-3.0, -5.0, 0.0) == -3.0
Constrain(-6.0, -5.0, 0.0) == -1.0
Constrain(-10.0, -5.0, 0.0) == -5.0
注意,min
PARAM可以被認爲是總數值小於max
。
有可能是一個非常簡單的公式來解決這個問題,但我是驚人的愚蠢不知道它的廣義解決方案。
幾乎FMOD(和fmodf)確實。但不完全。這就是我的目標。我認爲我最喜歡最好的一個。較少的分支(取決於當然如何在libc中實現floor())。我會試一試並報告我的結果。 – orj 2011-03-14 22:17:10
無賴。第二個實施選項不通過測試。首先是。 – orj 2011-03-14 22:22:03
糟糕。全腦失敗。再試一次。抱歉! – 2011-03-14 22:50:37