の丸めfloat
と への変換について、非常に奇妙な事実に直面していint
ます。
ここに記載されているように: http://www.gnu.org/software/libc/manual/html_node/Rounding.html
最も近い表現可能な値への丸めは、デフォルトの丸めモードです。しかし、そうではないようです。
だから私はこの簡単なプログラムを作成しました:
#include <fenv.h>
#include <stdio.h>
int a;
double b;
main() {
b=1.3; a=b; printf("%f %d\n",b,a);
b=1.8; a=b; printf("%f %d\n",b,a);
b=-1.3; a=b; printf("%f %d\n",b,a);
b=-1.8; a=b; printf("%f %d\n",b,a);
printf("%d %d %d\n",fegetround(),FE_TONEAREST,FE_TOWARDZERO);
}
プログラムは、gcc-4.7 (debian)、cygwin gcc、および Visual studio でコンパイルされました。出力は同じで、の定義のみがFE_TOWARDZERO
変更されました。
プログラムの出力:
1.300000 1
1.800000 1
-1.300000 -1
-1.800000 -1
0 0 3072
FE_TONEAREST
したがって、テストしたすべてのコンパイラで丸めモードが (デフォルト) に設定されていることがはっきりとわかりますが、それらはすべてゼロに向かって丸められています。
なんで?
PS: はい、使用できますMath.round()
が、なぜこれが起こっているのか疑問に思っています。