2017-07-31 51 views
0

對於哪個輸入是否減少到標識(模1的ulp)?在倒置時關閉雙值

public static double invertTwice(double value) { 
    double inverse = 1.0/value; 
    return 1.0/inverse; 
} 

此外,什麼是最大間隔爲[min, max]該函數是單位(模1 ULP)?

倒數時,範圍[1E-320 ... 1E-310]中的值如何映射到+ Infinity? (它的後續反轉將導致0.0!)

動機:的一般關係

a/b == a * (1.0/b) 

並不適用於所有雙對,即使b != 0.0,例如a = 0.0b = 4.9E-324

這有正火的載體時,必須考慮到,例如

[0.0 b 0.0] * (1.0/b) == [NaN Infinity NaN] 

[0.0/b b/b 0.0/b] == [0.0 1.0 0.0] 

備註:我的問題是不是標準化的載體,但什麼我上面寫的。謝謝!

+0

聽起來相似[這個問題](HTTPS://計算器。 COM /問題/ 44623331 /不-A-浮點倒數,總是往返/ 44626041#44626041)。 'invertTwice'函數是區間'[1.0,sqrt(2))'上的標識,並且可以避免使用任何2的冪來縮放該區間的結果,從而避免溢出和溢出。在'[sqrt(2),2.0)'上,它有點隨機,值接近'sqrt(2)'_usually_給出身份,接近'2.0'的值給出的概率約爲0.5。 –

+0

感謝您的指針和部分答案。當[1e-323 ... 1e-310]範圍內的值在倒置時如何映射到無窮大? (我正在使用Java) – datahaki

+0

由於最大可表示的IEEE 754雙精度浮點數大約爲1.8e308,因此對於小於5.56e-309的任何數據,其倒數大於最大可浮點浮點數,因此「無限」變爲無窮大。 –

回答

0

使用二分法搜索,我發現雙值的間隔是2倍下反轉不變

value == 1.0/(1.0/value) 

[5.562684646268010E-309 ... 1.7976931348623151E308]