2011-07-19 149 views
2

當我做類似如下:四捨五入整數浮點朝0

long x1 = LONG_MAX; 
float x2 = x1; 
long x3 = x2; 

我得到如下:

x1 = 2147483647 
x2 = 2147483648 
x3 = -2147483648 

有什麼辦法走向做從X1舍入到X2 0(甚至簡單地朝向負無窮)?

+0

傑伊發佈了一個正確的答案,然後刪除它... –

回答

0

這並不能解決您的問題,但是如果您使用double而不是float,那麼如果long爲32位,則這會起作用。

#include <limits.h> 
#include <stdio.h> 

int main() { 
    long x1 = LONG_MAX; 
    double x2 = x1; 
    long x3 = x2; 

    printf("x1 = %d\n", x1); 
    printf("x2 = %f\n", x2); 
    printf("x3 = %d\n", x3); 
} 
2

也許你對標準IEEE 754 rounding modes感興趣?

鏈接是libc;我不確定這是否會作爲語言本身的一部分進行標準化。

我想這會工作(未經測試):

#include <math.h> 

    int save_round_mode = fegetround(); 

    fesetround (FE_TOWARDZERO); 
    /* do stuff here */ 
    fesetround (save_round_mode); 
+2

這些功能實際上是C99標準的一部分,從頭文件''。但是,要小心編譯器優化 - 您可能需要在#/'#pragma STD FENV_ACCESS off'塊中使用'#pragma STDC FENV_ACCESS'來包圍代碼。 –

1

你應該對IEEE-754信息讀取wikipedia for float

如果2147483648轉換爲浮動,它會像

(1).0000...000 x 2 power 32 NOTICE there are twenty-three '0's after the point 

,完美等於2147483648

然而,對於2147483647,這是不可能的店整數的「所有信息」。因此,它必須被轉換成相同的浮動爲2147483648

讓我們看看少浮最近2147483647,這是

(1).1111...111 x 2 power 31 NOTICE there are twenty-three '1's after the point 

數爲2147483520,比2147483648更進一步從2147483647

所以你明白爲什麼它應該是2147483648.

+0

=,=我的英語很差,直到現在我才知道你的想法......也許,你的意思是你想得到答案'2147483520'?那麼,舍入模式被提及爲小數部分,但不是整數部分。例如,1.6向0舍入爲1.0。 – Stan