給定兩個浮點值(fLow
和fHigh
),您如何計算兩個連續值之間的最大或最大步幅/間隙?一系列花車最大的不準確性是什麼?
例如:
在範圍16777217f
到20000000f
答案是2
,作爲值被有效地四捨五入到最接近的兩項。
把它推廣到一個任意的範圍讓我撓了撓頭 - 有什麼建議嗎?
歡呼聲,
這應該是中性語言,但我使用C#(它符合IEEE-754對於這一點,我認爲)。
給定兩個浮點值(fLow
和fHigh
),您如何計算兩個連續值之間的最大或最大步幅/間隙?一系列花車最大的不準確性是什麼?
例如:
在範圍16777217f
到20000000f
答案是2
,作爲值被有效地四捨五入到最接近的兩項。
把它推廣到一個任意的範圍讓我撓了撓頭 - 有什麼建議嗎?
歡呼聲,
這應該是中性語言,但我使用C#(它符合IEEE-754對於這一點,我認爲)。
這是在C.它需要一些IEEE 754行爲,舍入等。對於IEEE 754的64位二進制(double
)SmallestPositive
是2 -1074,大約4.9406564584124654417656879286822137236505980261e-324,和DBL_EPSILON是2 -52,2.220446049250313080847263336181640625e-16。對於32位二進制(float
),改變DBL
到FLT
和double
到float
無論他們在哪裏出現。(和fabs
到fabsf
和fmax
到fmaxf
,儘管它應該沒有這些改變工作)。然後SmallestPositive
是2 -149,大約1.401298464324817070923729583289916131280261941876515771757068283889791e-45,和FLT_EPSILON是2 -23,1.1920928955078125e-07。
對於兩個值之間的間隔,最大步長當然是更大幅度端點處的步長。 (如果該端點恰好是2的冪,從該點步長到下一個不會出現在區間本身,所以這將是一個特殊的情況。)
#include <float.h>
#include <math.h>
/* Return the ULP of q.
This was inspired by Algorithm 3.5 in Siegfried M. Rump, Takeshi Ogita, and
Shin'ichi Oishi, "Accurate Floating-Point Summation", _Technical Report
05.12_, Faculty for Information and Communication Sciences, Hamburg
University of Technology, November 13, 2005.
*/
double ULP(double q)
{
// SmallestPositive is the smallest positive floating-point number.
static const double SmallestPositive = DBL_EPSILON * DBL_MIN;
/* Scale is .75 ULP, so multiplying it by any significand in [1, 2) yields
something in [.75 ULP, 1.5 ULP) (even with rounding).
*/
static const double Scale = 0.75 * DBL_EPSILON;
q = fabs(q);
return fmax(SmallestPositive, q - (q - q * Scale));
}
謝謝 - 沒有意識到這個概念是如此主流 - 谷歌搜尋ULP也讓我http://en.wikipedia.org/wiki/Unit_in_the_last_place和http://docs.oracle.com/javase/1.5.0/docs /api/java/lang/Math.html#ulp%28double%29 - 看起來好像沒有內建的C#但現在已經足夠了,我想,非常感謝 – user2152466 2013-03-20 23:11:53
好,機器精度,正如名稱所表明的那樣,通常可能取決於機器甚至編譯器。所以,要確定你通常必須編寫一個程序來真正測試正在發生的事情。
但是,我懷疑你真的在尋找一些方便的公式,你可以使用近似在給定的時間間隔內的最大距離。關於machine epsilon的維基百科文章給出了關於這個主題的非常好的概述,我在下面主要從這個源引用。
讓s
是您的浮點表示(即,大約2 ^( - 在標準浮標的情況下24))的機ε,那麼標準化數x
和其鄰居之間的最大間隔是2*s*|x|
。這個詞標準化真的是至關重要這裏我甚至不會嘗試考慮非歸數的情況,因爲這就是事情真的討厭...
也就是說,在您的特定情況下,最大間距h
在你建議的時間間隔內給出h = 2*s*max(|fLow|, |fHigh|)
。
你是怎麼到達這個特定範圍的'2'的? – 2013-03-20 22:53:14
難道只是2^ExpMax? – 2013-03-20 22:53:57
科爾是正確的,只要你不必處理subnormals。 @ user2152466,你對浮點數了解多少,以及你對哪些範圍感興趣?你需要能夠做到這一點絕對適合浮動的任何東西嗎? – 2013-03-20 22:58:00