2017-01-23 25 views
2

私は、2つの数値を分割する必要があるコード行を実装しました。結果は次の整数に切り上げる必要があります。私は非常に単純に開始しました:なぜ整数型の代わりに "ceil()"関数の戻り値の型が "double"ですか?

i_quotient = ceil(a/b); 
番号 aとして

b両方の整数であるが、これは動作しませんでした:分裂はデフォルトで切り捨てされた整数の除算、として実行されますので、私は強制する必要があります浮動小数点演算すべき部門:

​​

は今、これが動作しているようですが、それは私が整数にダブルを割り当てるしようとしていますと言って警告し、実際に、ヘッダファイル以下「のmath.hを残し"ceil()関数の戻り値の型は" double "で、今は失われています:arの意味は?ダブル関数を返す関数をounding?誰も私にこれについて啓発することはできますか?

+2

引数が大きすぎて整数型で表現できない場合は、どのように 'ceil'を指定しますか?例えば。 '1E500'? –

+0

なぜ 'i_quotient =(a + b-1)/ b;'をしないのですか? – mch

答えて

1

なぜでしょうか? intとdoubleの変換には時間がかかります。このオーバーヘッドは重要になります。あなたはこのレイテンシーについての詳細をお知りになりたい場合は

i_quotient = (int)ceil((double) a/b); 

チェックthis answer:あなたはとても明示的に行うintにdoubleを変換したい場合。あなたはCが古くなり、達成可能なパフォーマンスが最優先事項の1つであったと考える必要があります。しかし、C#やその他の現代の言語でさえ、通常、一貫性のためにceilの浮動小数点値を返します。

6

doubleには、任意の整数型より大きい範囲があります。 doubleを返すことは、結果の型に可能なすべての入力を処理できる範囲があることを保証する唯一の方法です。

+0

実装を分けることができます_can_は、 'double'よりも多くのビットを持つ整数を提供し、 'double'は' long long'より精度が低い可能性があります。 – Olaf

+0

@Olaf:整数型が* double *より多くのビットを持つことができるような稀にしかない実装でさえ、無限値は整数型の範囲外です。 – chqrlie

+0

@chqrlie:コメントの後半に集中する必要があります。 64ビットの 'double'(x86/x86/ARMなど)のすべてのアーキテクチャでは、' long long'は常により重要なビットを持ちます。 LP64(POSIX64など)では、これは 'long'にも当てはまります。私は彼らが同じ範囲を表すことができるとは言わず、「ダブル」を使用しないことをお勧めしません。 – Olaf

2

ceil()は、引数としてdoubleをとります。整数を返すのであれば、それでは整数型を選択しても、その天井値を表すことができますか? 型が何であっても、可能なすべてのdouble値を表すことができるはずです。

可能な限り高い値を保持できる整数型はuintmax_tです。 しかし、それはすべての値を保持できることを保証するものではありません。

したがって、ceil()の値をdoubleに戻すと意味があります。整数値が必要な場合、呼び出し側は常にそれを目的の整数型にキャストできます。

0

オペレーションは2つの整数a,bで始まり、doubleをとる関数double ceil(double)が整数型を返さない理由について質問します。

ほとんどの浮動小数点数学関数は浮動小数点引数をとり、同じ型を返します。

double ceil(double)が整数型を返さない大きな理由は、制限された機能がほとんど必要ないためです。整数型は、doubleより制限された範囲を持っています(またはほとんどの場合)。 ceil(DBL_MAX)は整数型に収まるとは限りません。


整数問題を解決するには、double演算を使用する必要があります。

コードで整数を除算し、商を切り上げる必要がある場合は、次のようにします。参考:@mch

i_quotient = (a + b - 1)/b; 

上記OPの例a >= 0b > 0のほとんどを処理します。 aまたはbが負の場合、またはa + b - 1がオーバーフローする可能性がある場合は、他の考慮事項が必要です。

関連する問題