2014-03-26 80 views
9

With float a = ...; and float inva = 1/a; is x/ax * inva相同?x/a與浮點數的x *(1/a)相同嗎?

什麼是這種情況:

unsigned i = ...; 
float v1 = static_cast<float>(i)/4294967295.0f; 
float scl = 1.0f/4294967295.0f; 
float v2 = static_cast<float>(i) * scl; 

v1等於v2所有無符號整數?

+3

這裏的第一個答案可能會爲您提供一些信息:http://stackoverflow.com/questions/22621241/what-does-the-constant-0-0039215689-represent –

+0

同樣的問題不斷出現在不同的形式。見http://floating-point.gui.de/ – devnull

+3

@devnull:該網站已經死亡。 –

回答

7

v1等於v2所有無符號整數?

是的,因爲4294967295.0f是兩個冪。當除數是2的冪(假設互惠的計算沒有溢出或下溢到零)時,除法和乘法的倒數是等價的。

除法和相乘的乘法一般不是等價的,只是在兩個冪的特定情況下。原因是對於(幾乎所有)兩個y的冪,1/y的計算是準確的,因此x * (1/y)只輪次一次,就像x/y只輪次一次。

+0

那麼我需要使用4294967296.0嗎?因爲4294967295不是2的冪... – Danvil

+3

@Danvil有趣的是,4294967295不是2的冪,但是在大多數編譯平臺上的'4294967295.0f'是最接近4294967295的單精度IEEE 754數字,是4294967296,實際上是兩個冪。 –

+3

請注意,實際上4294967295.0f可能被認爲是'=='到4294967296.0f,因爲試圖將2^32-1表示爲float的精度損失問題...因此,儘管它不是真正的2的冪(沒有奇數可以,根據定義,除了2^0 = 1),它可能看起來是...... – twalberg

5

不,結果並不總是一樣的。在浮點乘法中對操作數進行分組的方式,或者在這種情況下進行分割,會影響答案的數字準確性。因此,產品a*(1/b)可能與a/b不同。檢查維基百科文章http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

+0

我以爲是這樣,但在整數的情況下,我找不到一個反例... – Danvil

相關問題