(注: OPは0または-Infinityへの丸めを明示的に指定していないため、この他の質問と同じではありません)
JLS 15.17.2は、整数除算はゼロに向かって丸められると述べています。正の約数の動作のようなものが必要な場合floor()
(負の約数の動作は気にしません)、すべての入力に対して数値的に正しいこれを実現する最も簡単な方法は何ですか?
int ifloor(int n, int d)
{
/* returns q such that n = d*q + r where 0 <= r < d
* for all integer n, d where d > 0
*
* d = 0 should have the same behavior as `n/d`
*
* nice-to-have behaviors for d < 0:
* option (a). same as above:
* returns q such that n = d*q + r where 0 <= r < -d
* option (b). rounds towards +infinity:
* returns q such that n = d*q + r where d < r <= 0
*/
}
long lfloor(long n, long d)
{
/* same behavior as ifloor, except for long integers */
}
int
(更新:とlong
算術の両方の解決策が欲しいです。)