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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Ganimata

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

#1

投稿記事 by Ganimata » 4年前

実数を偶数単位で切り上げ・切り下げする関数が欲しくて作ったのですが、
なにかこう、もっと単純明快なやり方があるような気がします。

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

コード:

// 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: 実数を偶数単位で切り下げ切り上げする関数

#2

投稿記事 by かずま » 4年前

Ganimata さんが書きました:
4年前
なにかこう、もっと単純明快なやり方があるような気がします。

コード:

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

コード:

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

Ganimata

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

#3

投稿記事 by Ganimata » 4年前

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

返信

“C言語何でも質問掲示板” へ戻る