私は単に整数のべき乗を計算するプログラムを書いていました。しかし、出力は期待どおりではありませんでした。 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()
関数を使用できませんか??
浮動小数点の精度はここでその仕事をしています。 pow
の実際の動作はlog
を使用しています
pow(a, 2) ==> exp(log(a) * 2)
math.h
ライブラリを見てください:
<math.h>
/ * FPUの数学演算に64ビットの仮数を使用すると精度が高くなり、一部のMSVCRT数学関数で予期しない結果が生じる可能性があります。たとえば、関数の戻り値が保存されていない場合(53ビットの仮数に切り捨てる)、xとyの両方を整数値としてpowを呼び出すと、非整数の結果が生成されることがあります。 ... * /
0.5
をpow
の戻り値に追加し、それを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;
}
Cライブラリ関数double pow(double x、double y)
ダブルタイプがかかります
intベースのパウはありません。あなたが苦しんでいるのは、浮動小数点の切り捨てです。
intベースのPowの制約が大きすぎます(入力範囲がintをすぐにオーバーフローします)。多くの場合、intベースのパウは、2のべき乗を他の方法で効率的に実行できる場合のように。
printf("%a", pow(10, 2))
および取得内容を確認します。 quite 100を取得しないでください。切り捨てるのではなく丸める場合は、lround
を呼び出します。