ページ 11

実数を偶数単位で切り下げ切り上げする関数

Posted: 2019年10月02日(水) 18:56
by Ganimata
実数を偶数単位で切り上げ・切り下げする関数が欲しくて作ったのですが、
なにかこう、もっと単純明快なやり方があるような気がします。

もしあれば、教えてください

コード:

// x を偶数に切り下げる
float even_floor(float x) {
	// 整数に切り下げる
	int a = (int)floorf(x);

	// 奇数なら -1 する
	if (a >= 0) {
		if (a % 2 == 0) a--;
	} else {
		if (-a % 2 == 0) a--;
	}
	
	// 終了
	assert(a % 2 == 0);
	return (float)a;
}

// x を偶数に切り上げる
float even_ceil(float x) {
	// 整数に切り上げる
	int a = (int)ceilf(x);

	// 奇数なら +1 する
	if (a >= 0) {
		if (a % 2 == 0) a++;
	} else {
		if (-a % 2 == 0) a++;
	}

	// 終了
	assert(a % 2 == 0);
	return (float)a;
}

Re: 実数を偶数単位で切り下げ切り上げする関数

Posted: 2019年10月02日(水) 19:40
by かずま
Ganimata さんが書きました:
5年前
なにかこう、もっと単純明快なやり方があるような気がします。

コード:

float even_floor(float x) { return floorf(x / 2) * 2; }
float even_ceil(float x) { return ceilf(x / 2) * 2; }
Ganimata さんが書きました:
5年前

コード:

		if (a % 2 == 0) a--;
4つの a % 2 == 0 は a % 2 == 1 の間違いではありませんか?

Re: 実数を偶数単位で切り下げ切り上げする関数

Posted: 2019年10月03日(木) 07:07
by Ganimata
除算してから floor というのは目から鱗でした。ありがとうございます!
4つの a % 2 == 0 は a % 2 == 1 の間違いではありませんか?
おっしゃる通りで、奇数の判定方法を間違えていました :(