web-dev-qa-db-ja.com

Cでのround()関数の使用

Cのround()関数について少し混乱しています。

まず第一に、男は言う:

SYNOPSIS
   #include <math.h>
   double round(double x);

RETURN VALUE
   These functions return the rounded integer value.
   If x is integral, +0, -0, NaN, or infinite, x itself is returned.

戻り値はdouble/floatまたはint?です。

2番目に、最初に丸め、次にintにキャストする関数を作成しました。私のコードの後半で私はそれを平均値として使用していますdoublesを比較する

int tointn(double in,int n)
{
    int i = 0;
    i = (int)round(in*pow(10,n));
    return i;
}

この関数は、私のテスト全体を通して安定していないようです。ここに冗長性はありますか?ええと...私は答えだけを探しているのではなく、主題についてのより良い理解を探しています。

10
Mattana

マンページの表現は、文字通り読むことを意図しています。つまり、その数学的意味です。 「xは整数である」という表現は、x[〜#〜] z [〜#〜]の要素であることを意味しますではなく、xのデータ型はintです。

doubleintにキャストすると、doubleが保持できる任意の整数値の最大値が2 ^ 52(IEEE 754準拠のbinary64であると想定)、最大値intが保持できる容量は小さくなる可能性があります(32ビットアーキテクチャでは32ビットであり、64ビットでも32ビットです。アーキテクチャ)。

10のべき乗のみが必要な場合は、この小さなプログラムを使用して自分でテストできます。

_#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(){
  int i;
  for(i = 0;i < 26;i++){
    printf("%d:\t%.2f\t%d\n",i, pow(10,i), (int)pow(10,i));
  }
  exit(EXIT_SUCCESS);
}
_

キャストする代わりに、適切な整数データ型を返す関数を使用する必要があります(例:lround(3))。

6
deamentiaemundi

これは、manページからの抜粋です。

   #include <math.h>

   double round(double x);
   float roundf(float x);
   long double roundl(long double x);

注意:戻り値は整数ではありません。ただし、戻り値の小数部分は0に設定されます。

注意:呼び出される関数に応じて、戻り値のタイプが決まります。

以下は、丸めがどのように行われるかについてのmanページからの抜粋です。

   These functions round x to the nearest integer, but round halfway cases
   away  from  zero  (regardless  of  the  current rounding direction, see
   fenv(3)), instead of to the nearest even integer like rint(3).

   For example, round(0.5) is 1.0, and round(-0.5) is -1.0.
4
user3629249