編輯:我在調試會議期間犯了一個錯誤,導致我問這個問題。我看到的差異實際上是在打印雙精度和解析雙精度(strtod
)。斯蒂芬的回答在整頓之後仍然很好地回答了我的問題,所以我想我會留下這個問題,以防其他人有用。在打印,轉換中考慮FPU舍入模式的編譯平臺
一些(最多)C彙編平臺我訪問不採取FPU舍入模式考慮在內時
- 64位整數轉換成
double
; - 印刷
double
。
這裏沒什麼特別的:Mac OS X Leopard,各種最新的Linux和BSD變種,Windows。
另一方面,Mac OS X Snow Leopard在做這兩件事情時似乎將舍入模式考慮在內。當然,擁有不同的行爲讓我無法終結。
下面是兩種情況的典型片段:
#if defined(__OpenBSD__) || defined(__NetBSD__)
# include <ieeefp.h>
# define FE_UPWARD FP_RP
# define fesetround(RM) fpsetround(RM)
#else
# include <fenv.h>
#endif
#include <float.h>
#include <math.h>
fesetround(FE_UPWARD);
...
double f;
long long b = 2000000001;
b = b*b;
f = b;
...
printf("%f\n", 0.1);
我的問題是:
- 是不是有什麼不醜,我可以做標準化在所有平臺上的行爲?一些隱藏的設置可以告訴那些採用舍入模式的平臺,而不是反過來?
- 是行爲標準之一嗎?
- 當不使用FPU舍入模式時,我可能會遇到什麼?向零回合?回合到最近?請告訴我,只有一個替代:)
關於2.我發現在標準的地方,它說,浮動轉換爲整數總是截斷(舍入爲零),但我不能找到整數 - >浮動方向的任何東西。
感謝您的詳盡答覆。對於整數 - >雙重轉換,我將嘗試用'f =(double)(b&0x00000000FFFFFFFF)+(double)(b&0xFFFFFFFF00000000);'來代替'f = b;';',這應該在所有地方給出相同的行爲 - 每個轉換是準確的,舍入決定是由雙+做出的,並且應該總是按照主要的舍入模式。 – 2010-04-07 23:04:16
@Pascal:是的,它應該可以工作(實際上在某些平臺上如何實現int64 - > double轉換)。但是,我也發現,Intel有*兩組舍入控制位(x87和SSE)。我知道雪豹上的'fesetround'設置了它們兩個;是否有可能無法在其他平臺上設置兩個控制字,並且某些轉換是使用未設置控制字的單元完成的?可能值得研究這種可能性。 – 2010-04-07 23:08:25