0

私は今日、数字の半分を切り上げることについて尋ねていましたが、@alk から大きな助けを得ました。その投稿では、私の考えは 4.5 を 5 に切り上げ、4.4 を 4 に切り下げることでした。そして、@alk によって与えられた解決策は次のとおりです。

int round_number(float x)
{
 return x + 0.5;
}

そしてそれは非常にエレガントに機能します!

この投稿では、C で関数を実装する方法について説明したいと思いceil()ます。@alk によって提供された最後の解決策と同じ方針に沿って、次のことを思いつきました。

int round_up(float y)
{
   return y + 0.99999999;
}

これは、浮動小数点数 y が .00000001 の場合を除いて、すべての状況で機能します。ceil()Cと同じことを行うより良い方法があるかどうか疑問に思っています.

4

3 に答える 3

1

これは負の数では失敗します。

int round_up(float y) {
 return y + 0.99999999;
}

しかし、それを有利に利用しましょう。 floatto intconversion は 0.0 に向かって切り捨てられます。したがって、負の数は「切り上げ」または「上限」機能を実行しています。正の がある場合は、これが「フロア」関数であることfloatに注意してください。が整数でないint場合に調整します。y

y(以内と仮定しますINT_MIN ... INT_MAX。)

int ceil(float y) {
   if (y < 0) {
     return y;  // this does a ceiling function as y < 0.
   }
   int i = y; // this does a floor function as y >= 0.
   if (i != y) i++;
   return i;
 }

void ceil_test(float y) {
   printf("%f %d\n", y, ceil(y));
}
于 2014-03-02T05:13:10.370 に答える
0

最初のスニペットは、負の数に対して正しく機能しません。-3.5 は -4 ではなく -3 になります。値を適切に丸めるには

int round_number(float x)
{
    if (x >= 0)
        return x + 0.5f;
    else
        return x - 0.5f
}

そのようにしても、2 つの値に対してはまだ正しくありません。Math.round(0.49999999999999994) が 1 を返す理由を参照してください。. リテラルfを取得するには接尾辞を使用する必要があることに注意してください。そうしないと、操作は正確に行われ、その後にダウンキャストされますfloatdoublefloat

シーリングは1足すれば十分

int ceiling(float x)
{
    if (x < 0 || (int)x == x)
        return x;
    else
        return x + 1.0f;
}

x が整数の場合、たとえば x = 3.0 (または -3.0) の場合、3 (または -3) が返されます。x = 3.1 の場合は 4 を返し、x = -3.1 の場合は -3 を返します。

于 2014-03-02T07:09:24.443 に答える