auto x = a + (b-a)*v;
其是指由以下因素v
在[0,1.0)
以在範圍[a,b)
的值。從純粹的數學角度來看,x>=a
和x<b
。但是,我們如何證明或確保這適用於浮點? a
,b
,v
是(double
或float
)相同類型的非負的有限浮點值和b>a
(原稱b>=a
這與我對x
要求明顯不符),以及v<=netxtafter(1.0,0)
(即,它的正下方1.0)。
它似乎很明顯,那b-a >0
,因此(b-a)*v >=0
,所以我們並不需要檢查:
if (x<a) return a;
但是,這也是多餘的?
if (x>=b) return std::nextafter(b,a);
編譯器(優化)是否可以重寫表達式來影響這些問題? 浮點表示的類型是否進入? (我在最常見的(iec559/IEEE 754)最感興趣。
我不明白這個問題。如果你的等式適用於任何(正)實數,它也適用於任何浮點數,因爲Q(有理數)是R(實數)的一個子集,浮點數是Q的子集... –
我猜可能發生的最糟糕的是當你的數字例如無論是v,b還是a(或全部)都非常小或接近邊界,在這種情況下,截斷可能是一個問題..但截斷總是朝向較低的值,並且所有數字都是正數... –
@CedricDruck ,這樣說:如果沒有問題,應該很容易證明。謹慎寫一個答案? –