編集:デバッグセッション中に間違いを犯したため、この質問をすることになりました。私が見た違いは、実際にはdoubleの印刷とdoubleの解析(strtod
)にありました。スティーブンの答えは、この修正後も私の質問を非常によくカバーしているので、誰かに役立つ場合に備えて、質問はそのままにしておくと思います。
私がアクセスできるいくつかの(ほとんどの)Cコンパイルプラットフォームは、FPU丸めモードを考慮に入れていません。
- 64ビット整数を
double
;に変換します。 - 印刷
double
。
ここでは非常にエキゾチックなものはありません。MacOSXLeopard、最近のさまざまなLinuxおよびBSDバリアント、Windows。
一方、Mac OS X Snow Leopardは、これら2つのことを行うときに、丸めモードを考慮に入れているようです。もちろん、異なる行動をとることは私に終わりがないことを苛立たせます。
2つのケースの典型的なスニペットは次のとおりです。
#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);
私の質問は次のとおりです。
- すべてのプラットフォームで動作を正規化するためにできる、醜くないことはありますか?丸めモードを考慮に入れているプラットフォームに、またはその逆を行わないように指示するための隠された設定はありますか?
- 動作の標準の1つですか?
- FPU丸めモードを使用しない場合、何が発生する可能性がありますか?ゼロに向かって丸めますか?最も近いものに丸めますか?選択肢は1つしかないことを教えてください:)
2.について標準では、整数に変換された浮動小数点数は常に切り捨てられる(ゼロに丸められる)と言われている場所を見つけましたが、整数->浮動小数点数の方向については何も見つかりませんでした。