質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

2422閲覧

C言語で関数を使わずに小数点以下を切り上げる方法

R_SSK

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/06/23 23:26

編集2020/06/25 07:55

C言語のflaot型の数値を、関数を使わずに切り上げるいい方法はありますでしょうか?
+0.9999999では1.0e-7より小さい数が切りあがりませんし、+1.0e-0x1.0p-126fのようにしても桁落ちしてしまいます。
よろしくお願いいたします。

※質問への追記
回答が遅くなり申し訳ございません。
・挙動はceilと同じような動きを想定してます。
・切り上げ後の型はfloatでもint型でも構いません。
・組み込みで使うため、できるだけ関数の使用を避けたいです。
・浮動小数点演算機能はあるものとしています。
・固定小数点演算では条件が厳しくなると桁落ちが発生するので浮動小数演算への変換を考えています。

aのbによる整数同士の除算の余りを
(a + b -1) / b
で切り上げるようなすっきりとしたやりかたがないものかと思いお聞きしました。
ceilを使うか、条件分岐を使えばいいのですが、上記のようなスマートなやり方はないものかと思った次第です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daregada

2020/06/24 00:01

負の値も対象に入りますか? 入る場合は、ceil と同じ挙動でいいのですか?
maisumakun

2020/06/24 00:55

切り上げ後の型もfloatのままでしょうか?
ikadzuchi

2020/06/24 01:14

なぜ関数を使わずに行いたいのですか?
thkana

2020/06/24 13:41

お題の面白さを損なってしまいますが、組み込みだから...を言うなら関数以前に浮動小数点演算のほうが嫌われると思いますし、それほどの有効数字が要求されるものなのでしょうか。(必要だ、と言われればそうですか、としかいいようがないですけれど) 「いい方法」は、目的や使われる状況の諸々を勘案して「いい」「わるい」が決まるかと思います。 ところで、 > aのbによる除算 a,b は整数なのですか? 整数なら、a/b+(a%b!=0) でよさそうな気はします。
ikadzuchi

2020/06/25 05:16

組み込みというと幅が広いので具体的なCPUが知りたいですね。浮動小数点演算機能はあるのでしょうか。 浮動小数点数をやめて固定小数点数にした方が楽で速そうな気がします。 なお、C言語でceilと条件分岐を使わず切り上げる方法は思いつきませんでした。
guest

回答4

0

ベストアンサー

(f-(int)f)?(int)f+1:(int)f

でどーでしょう

投稿2020/06/23 23:31

y_waiwai

総合スコア87793

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C

1float a = 1.00001; 2float b = (int)a + ((int)a<a);

もしくは

C

1float a = 1.00001; 2float b = (int)a; 3float b += (b<a);

とか?
あまりお行儀の良くない方法だけど。

投稿2020/06/25 23:25

amiya

総合スコア1218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

仕様が確定していませんが、

C

1float a = 3.1415926f; 2float b = (int)(a > (int)a ? a + 1 : a);

みたいなことでしょうか。

投稿2020/06/24 01:39

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

c

1(long)((f * 10) + 9) / 10

整数桁が大きすぎると破綻します(8桁まで?)

投稿2020/06/24 00:30

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikadzuchi

2020/06/24 01:17

0.01などが切り上がらないように見えますが。
ttyp03

2020/06/24 01:39

小数点以下切り上げか。 小数点第一位を切り上げと勘違いしてました。 こりゃダメですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問