Windows の C99 lrint 関数の正しい代替手段は何ですか?
#define lrint(x) (floor(x+(x>0) ? 0.5 : -0.5))
/* and if fesetround(0) behavior is required*/
#define lrint(x) ((int)(x))
あれは正しいですか?
lrint
C99 標準で定義された動作を実行する[単純な] 単一の定義はありません。これは、 の動作がへのlrint
個別の呼び出しによって制御されるためfesetround
です。代わりに、アプリケーションの目的の動作に対してセマンティクスが保証された別の丸め関数を使用する必要があります。
floor(x+(x>0) ? 0.5 : -0.5)
正の数のみを正しく丸めますが、負ではありません。これは、 floor() が負の無限大に向かって丸められるためです。 -8 のままですが、最も近い整数に正しく丸めると -7 になります。次のコードは、正しい丸めを行います。
return int(x + ((x >= 0.0) ? 0.5 : -0.5));
あるいは、
return ((x >= 0.0) ? floor(x+0.5) : ceil(x-0.5));