3

私は2つの変数を持っています:

size_t a = 63;
size_t b = 32;

関数を呼び出しましたceil(a/b)。当然、答えが返ってくると思います2が、代わりに が返されます1

私は困惑しています。変数をdoubleまたはintにキャストしようとしましたが、役に立たないようです。

助けてくれてありがとう。

4

4 に答える 4

3

するとどうなるかを分析してみましょうceil(a/b)。まず、a と b の間で整数除算が行われるため、63/32 は (int)1 になり、次にこの 1 が double にキャストされて 1.0 になり、ceil(1.0) はもちろん 1.0 になります。

2 を期待する場合は、除算を行う前に double に変換する必要があります。つまりceil(double(a) / double(b))、double 除算を使用します。

于 2013-10-02T02:56:22.570 に答える
1

ceilおよびfloor関数は型に対して機能しますdouble。整数除算を実行したため (size_tは整数型であるため)、結果は整数になります (つまり、すでに整数であるため、切り上げまたは切り捨てはできません)。double分割の前にキャストしてみてください:

ceil( double(a) / double(b) );
floor( double(a) / double(b) );

技術的には、最初のものだけをキャストする必要があります。これは、代わりに浮動小数点除算が得られるためです。しかし、明示的で両方をキャストするのは良いことです。

于 2013-10-02T02:51:04.807 に答える
0

63 と 32 は両方とも int であるため、結果は int になります (つまり、1.96875 ではなく 1 になります)。

paddy で指定されたとおりに型キャストするか、

または double 値を使用する

ceil(63.0/32); // promotes 32 from int to double since one of the operand(63.0) is double.
ceil(63.0/32.0); // both operands are doubles
于 2013-10-02T02:55:03.663 に答える
0

a/bこれらは整数型であるため、整数除算が実行されます。これにより、 std::ceilが表示されている値を返す1理由が説明されます。C++ 標準セクションの草案を見ると、乗法演算子の段落4には次のように書かれています (強調鉱山):5.6

二項 / 演算子は商を生成し、二項 % 演算子は最初の式を 2 番目の式で割った剰余を生成します。/ または % の 2 番目のオペランドがゼロの場合、動作は未定義です。整数オペランドの場合、/ 演算子は小数部分を破棄して代数商を生成します。[...]

どちらかのオペランドをdoubleにキャストするだけで十分です。これは、の段落10のセクションで説明されている算術変換によるものです(強調鉱山):5

算術型または列挙型のオペランドを期待する多くの二項演算子は、同様の方法で変換を行い、結果の型を生成します。目的は、結果の型でもある共通の型を生成することです。このパターンは通常の算術変換と呼ばれ、次のように定義されます。

次の箇条書きが含まれます。

それ以外の場合、いずれかのオペランドが double の場合、もう一方は double に変換されます。

したがって、次の式はあなたが望む結果をもたらします:

std::ceil( double(a)/b)
于 2013-10-02T03:16:34.070 に答える