2012-11-23 82 views
0

我試圖將double值轉換爲指數,但我得到了舍入誤差。C double to Exponential round error

int main (unsigned int argc, char **argv) 
{ 
    float a=293.17; 
    float b=293.10; 
    double ULfreq = 2089.555000; 
    double upfreq = 0.0; 
    long int t = 0; 
    long int u = 0; 

    upfreq = ULfreq * 1000000.0; 

    printf(" %f, upfreq:%22.16E\n", upfreq, upfreq); 

    return 0; 
} 

當我運行一個32位的電腦我得到以下結果這個代碼:

2089555000.000000, upfreq:2.0895549999999998E+09 

在64位的一個運行它給出了正確的答案。

是否有可能使一個32位服務器,以及如何在這個轉換工作?

+0

謝謝你沒有使代碼複製和粘貼... – glglgl

+1

@glglgl我在他的帖子上做了一個編輯,它應該是你現在可見或很快。 – Jite

+0

太好了,非常感謝! – glglgl

回答

4

這不是舍入誤差,而是浮點的表示特徵。大多數短的比例如1.1是基數2中的無限序列(如1/3 = 0.3333 ...以10爲底)。因此人們必須將其夾在某處。當轉換回十進制時,就會得到2.08955499999。

在第一種情況下,你問的printf函數將其舍入到%F,這是小數點後6位小數的默認精度。在第二種情況下,你問22位數的精度,並得到...

+0

'base 10'等一下,是兩個還是十個;-) – slebetman