2017-03-04 46 views
0

我想將浮點數分成兩個單獨的部分作爲實部和非實部。 例如:如果x = 45.678,那麼我的功能必須給real= 45non_real=678。我已經嘗試了以下邏輯。通用函數提取沒有Floor的float的小數部分()

split (float x, unsigned int *real, unsigned int *non_real) 
{ 
    *real = x; 
    *non_real = ((int)(x*N_DECIMAL_POINTS_PRECISION)%N_DECIMAL_POINTS_PRECISION); 
    printf ("Real = %d , Non_Real = %d\n", *real, *non_real); 
} 

其中N_DECIMAL_POINTS_PRECISION = 10000。它會給小數部分,直到4位數字,而不是之後。

它只適用於特定的小數點精度。該代碼不是通用的,它必須適用於所有浮動數字,例如9.56578445.6875322等等。所以如果有人能夠幫助我,這將是非常有益的。

在此先感謝。

+1

請選擇毒藥? C還是C++? –

+0

@EdHeal似乎在片段中沒有C++代碼。 –

+0

你可以轉換爲字符串並按點分割。在你的問題中有一個問題:小數部分是理論上無限的,所以不能適合一個整數,它可能會返回68799像68799000001取決於精度... –

回答

0

使用floor()找到整數部分,然後從原始值中減去整數部分以找到小數部分。

注意:您最可能遇到的問題是,某些數字對於整數部分太大而不適合int的範圍。

--Added--

當且僅當你能夠承擔的unsigned int比浮點表示的尾數(如32位unsigned int和IEEE標準的單精度浮點較大的只有23小數位,其中「32 < 23」爲真);那麼對於unsigned int來說太大的數字不能有任何小數位。這導致如下解決方案:

if(x > UINT_MAX) { 
    integer_part = x; 
    fractional_part = 0; 
} else { 
    integer_part = (int)x; 
    fractional_part = x - integer_part; 
} 
+0

布倫丹我不能使用任何庫。 –

+0

@NitinNagaraj:然後我建議問一個題爲「如何實現'floor()'(使用內聯彙編或其他東西)」的新問題。 ;-) – Brendan

+0

有沒有其他的方法來實現這一點?沒有地板()。 –