2012-01-18 32 views
5

我正在研究C中的Nelder-Mead優化程序,其中涉及到兩個float的平均值。在罕見的(但完全可重現的)情況下,兩個floats,即xy,只有它們的有效位的最低有效位不同。當取平均值時,舍入誤差意味着結果將是xy如何指定在哪個方向上舍入兩個浮點數的平均值,這兩個浮點數根據其有效數的LSB而不同?

我想指定舍入應該總是朝向第二個float。也就是說,我不能簡單地指定四捨五入應該趨向於零或無窮大,因爲我不知道x是否會大於y

(How)can I do that?

+3

難道你不能只比較這兩個浮點數,並根據比較結果將舍入設置爲零,減去無窮大或加上無窮大? –

+0

但是,你可以在你四捨五入時確定是否是'x> y',對吧? –

+0

你可以,但有一個更簡單的方法來做到這一點。 –

回答

2

我不認爲有一個硬件舍入模式。你必須編寫自己的功能,然後,

double average(double x, double y) { 
    double a = 0.5*(x+y); 
    return (a == x) ? y : a; 
} 
+0

這就是我正在建議的。無論舍入模式如何,只要(a)描述的條件成立,或者(b)「x == y」,「a」只能等於「x」。在這兩種情況下,這會產生所需的結果,並且非常有效。 –

0

你可以識別特殊情況並選擇你想返回的值。

處於感興趣的值是:

  • 當值具有相同的符號和指數,僅由一個尾數不同。

  • 當這些值具有相同的符號時,指數相差一,指數較大的指數的尾數爲0,另一個尾數爲1。

事實上,如果你正在使用IEEE-754號(你可能是),你可以同時執行兩個測試(後檢查像零,天道酬勤,和楠的東西):

if ( repr1 + 1 == repr2 
    || repr2 + 1 == repr1) 
    .... 

其原因是指數位於尾數旁邊,如果尾數全是1,則加數將繼續進入指數字段。

然而,談到這一點,我會建議另一種策略。而不是簡單地返回第二個數字,你可以檢查第二個最重要的位,然後決定是否要舍入或舍入。這樣舍入誤差將會均勻分佈。