私は2つの変数を持っています:
size_t a = 63;
size_t b = 32;
関数を呼び出しましたceil(a/b)
。当然、答えが返ってくると思います2
が、代わりに が返されます1
。
私は困惑しています。変数をdoubleまたはintにキャストしようとしましたが、役に立たないようです。
助けてくれてありがとう。
するとどうなるかを分析してみましょう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 除算を使用します。
ceil
およびfloor
関数は型に対して機能しますdouble
。整数除算を実行したため (size_t
は整数型であるため)、結果は整数になります (つまり、すでに整数であるため、切り上げまたは切り捨てはできません)。double
分割の前にキャストしてみてください:
ceil( double(a) / double(b) );
floor( double(a) / double(b) );
技術的には、最初のものだけをキャストする必要があります。これは、代わりに浮動小数点除算が得られるためです。しかし、明示的で両方をキャストするのは良いことです。
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
a/b
これらは整数型であるため、整数除算が実行されます。これにより、 std::ceilが表示されている値を返す1
理由が説明されます。C++ 標準セクションの草案を見ると、乗法演算子の段落4には次のように書かれています (強調鉱山):5.6
二項 / 演算子は商を生成し、二項 % 演算子は最初の式を 2 番目の式で割った剰余を生成します。/ または % の 2 番目のオペランドがゼロの場合、動作は未定義です。整数オペランドの場合、/ 演算子は小数部分を破棄して代数商を生成します。[...]
どちらかのオペランドをdoubleにキャストするだけで十分です。これは、式の段落10のセクションで説明されている算術変換によるものです(強調鉱山):5
算術型または列挙型のオペランドを期待する多くの二項演算子は、同様の方法で変換を行い、結果の型を生成します。目的は、結果の型でもある共通の型を生成することです。このパターンは通常の算術変換と呼ばれ、次のように定義されます。
次の箇条書きが含まれます。
それ以外の場合、いずれかのオペランドが double の場合、もう一方は double に変換されます。
したがって、次の式はあなたが望む結果をもたらします:
std::ceil( double(a)/b)