web-dev-qa-db-ja.com

Cのintデータ型に対してpow()は機能しますか?

私は単に整数のべき乗を計算するプログラムを書いていました。しかし、出力は期待どおりではありませんでした。 5のべき乗を除くすべての整数で機能しました

私のコードは:

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

int main(void)
{
  int a,b;
  printf("Enter the number.");
  scanf("\n%d",&a);
  b=pow(a,2);
  printf("\n%d",b);
}
_

出力は次のようになります。

_"Enter the number. 2
 4
"Enter the number. 5
 24
"Enter the number. 4
 16
"Enter the number. 10
 99
_

Intデータ型にpow()関数を使用できませんか??

13
basanta

浮動小数点の精度はここでその仕事をしています。 powの実際の動作はlogを使用しています

pow(a, 2) ==> exp(log(a) * 2)

math.hライブラリを見てください:

<math.h>

/ * FPUの数学演算に64ビットの仮数を使用すると精度が高くなり、一部のMSVCRT数学関数で予期しない結果が生じる可能性があります。たとえば、関数の戻り値が保存されていない場合(53ビットの仮数に切り捨てる)、xとyの両方を整数値としてpowを呼び出すと、非整数の結果が生成されることがあります。 ... * /

0.5powの戻り値に追加し、それをintに変換するだけです。

b = (int)(pow(a,2) + 0.5);  

だから、あなたの質問への答え

Cのintデータ型に対してpow()は機能しますか?

常にではない。整数の累乗では、独自の関数を実装できます(これは+ ve整数でのみ機能します)。

int int_pow(int base, int exp)
{
    int result = 1;
    while (exp)
    {
        if (exp & 1)
           result *= base;
        exp /= 2;
        base *= base;
    }
    return result;
}
15
haccks

Cライブラリ関数double pow(double x、double y)

ダブルタイプがかかります

3
ANjaNA

intベースのパウはありません。あなたが苦しんでいるのは、浮動小数点の切り捨てです。

intベースのPowの制約が大きすぎます(入力範囲がintをすぐにオーバーフローします)。多くの場合、intベースのパウは、2のべき乗を他の方法で効率的に実行できる場合のように。

3
Keith Nicholas

printf("%a", pow(10, 2))および取得内容を確認します。 quite 100を取得しないでください。切り捨てるのではなく丸める場合は、lroundを呼び出します。

2
Carl Norum