4

pow() 関数は非常に奇妙な出力を出しています。

さまざまな組み合わせを試しました:

#include<stdio.h>
#include<math.h>
int main()
{
  int d=1;
  long long n1,n2;
  while(d<10)
  {

     n1=pow(10,d);
     n2=pow(10,d);
     d++;
     printf("%lld %lld\n",n1,n2);
  }
 }

これは間違った出力、つまり 100 ではなく 99 などを出力します。

ここで、変数の 1 つを削除すると、ans. 正しい。d の代わりに定数を使用する場合、ans は正しいです。n1 と n2 を double とすれば、ans は正しいです。

そのため、2 つの pow() 関数を使用して、変数をべき乗として持ち、型を整数としてキャストすると、出力が悪くなります。なぜこの奇妙な動作??

4

2 に答える 2

4

これは、浮動小数点値から整数を作成する場合 (丸めではなく、小数点以下を切り捨てます) にpow(x, y)変換されるという事実とともに、 x yexp(log(x) * y)と正確に同じではない結果が生成されます。 10 2の 99.9999996 (または 100.00002) など、浮動小数点値としての近似値。

丸めたい場合は、 を使用しますround(pow(x, y))

于 2013-06-15T10:17:45.373 に答える
2

pow変数で使用すると、その結果はdouble. に割り当てるとint切り捨てられ、99.9999999 ではなく 99 になります。

変数なしで使用powすると、コンパイラによって最適化されます (これはコンパイル時に計算されます)。

于 2013-06-15T10:15:49.727 に答える