なぜ標準C ++ライブラリに `int pow(int base、int exponent)`がないのですか?


116

見つけられないだけなのだと思います。C ++ pow関数がfloatsおよびdoubles 以外の「電源」関数を実装しない理由はありますか?

実装が簡単であることは知っています。標準ライブラリにあるべき作業をしているように感じます。堅牢なパワー関数(つまり、一貫した明示的な方法でオーバーフローを処理する)を書くのは楽しいものではありません。


4
これは良い質問で、答えはあまり意味がないと思います。負の指数は機能しませんか?符号なし整数を指数として使用します。ほとんどの入力はそれをオーバーフローさせますか?expとdouble powについても同じことが言えます。文句を言う人はいません。では、なぜこの関数は標準ではないのでしょうか?
static_rtti

2
@static_rtti:「expとdouble powについても同じです」は完全に偽です。答えを詳しく説明します。
スティーブンキャノン

11
標準C ++ライブラリにはdouble pow(int base, int exponent)、C ++ 11以降(§26.8[c.math] / 11箇条書き2)
Cubbi

「実装は取るに足らない」と「書くのは面白くない」のどちらかを決める必要があります。
ローン侯爵

回答:


66

の時点でC++11、一連のパワー関数(およびその他)に特別なケースが追加されました。C++11 [c.math] /11すべてのfloat/double/long doubleオーバーロードをリストした後の状態(私の強調、言い換え):

さらに、パラメータに対応する引数が型または整数型を持っている場合、パラメータに対応するすべての引数が効果的ににキャストされることを保証するのに十分な追加のオーバーロードがありdoubleます。doubledoubledouble

したがって、基本的には、整数パラメーターは操作を実行するためにdoubleにアップグレードされます。


以前はC++11(質問があったとき)、整数のオーバーロードは存在しませんでした。

私は作成者と密接に関係してCおらずC++、作成日も(私かなり年をとっています)、規格を作成したANSI / ISO委員会の一部でもないため、これは必然的に私の意見です。私はそれが情報に基づいた意見だと思いたいのですが、妻があなたに言うでしょう(頻繁にそしてあまり励まされる必要はありません)、私は以前に間違っていました:-)

価値のあるものとして、仮定が続きます。

私は疑う前の元ANSIが理由というCことは全く不要だったので、この機能を持っていなかったです。最初に、整数の累乗を実行する完全に優れた方法がすでにありました(倍精度浮動小数点数を使用し、単純に整数に変換し直して、変換前に整数のオーバーフローとアンダーフローをチェックしました)。

第二に、あなたは覚えている別のものは、本来の意図のがということであるCようだったシステム言語のプログラミング、そして浮動小数点が全くその舞台で望ましいかどうかは疑問です。

最初の使用例の1つはUNIXをコード化することだったので、浮動小数点は次に役に立たないでしょう。CのベースとなったBCPLもパワーを使用しませんでした(メモリからの浮動小数点はまったくありませんでした)。

余談ですが、積分べき乗演算子はおそらくライブラリ呼び出しではなく2項演算子でした。あなたは、2つの整数を追加していないx = add (y, z)が、とx = y + zの一部- 言語適切ではなく、ライブラリ。

第三に、積分能力の実装は比較的些細なことなので、言語の開発者がより有用なものを提供するために自分の時間をよりよく使うであろうことはほぼ確実です(機会費用に関する以下のコメントを参照)。

これはオリジナルにも当てはまりC++ます。元の実装は事実上、Cコードを生成するトランスレータであったため、の属性の多くを引き継ぎましたC。その本来の意図はC-with-classesであり、C-with-classes-plus-a-little-bit-of-extra-math-stuffではありませんでした。

以前C++11に標準に追加されなかった理由については、標準設定機関が従うべき特定のガイドラインがあることを覚えておく必要があります。たとえば、ANSI Cは、新しい言語を作成するのではなく、既存の慣行を成文化することを特に任務とされていました。そうでなければ、彼らは狂ってしまい、エイダを与えてくれたかもしれません:-)

その標準の後の反復にも特定のガイドラインがあり、理論的根拠文書で見つけることができます(言語自体の根拠ではなく、委員会が特定の決定を下した理由に関する根拠)。

たとえば、C99理論的根拠文書は、C89追加できるものを制限する2つの基本原則を具体的に進めています。

  • 言語は小さくシンプルにしてください。
  • 操作を行う1つの方法のみを提供します。

ガイドライン(必ずしもこれらの特定のものではない)は、個々のワーキンググループに定められているため、C++委員会(および他のすべてのISOグループ)も制限します。

さらに、基準設定機関は、彼らが行うすべての決定には機会費用(経済用語は意思決定の前に何をしなければならないかを意味する)があることを認識しています。たとえば、その10,000ドルのゲーム機を購入する機会費用は、約6か月間、他の半分との親密な関係(またはおそらくすべての関係)です。

エリックガンナーソンは、これがマイクロソフト製品に常に追加されない理由に関する-100ポイントの説明でこれをうまく説明しています。

言い換えれば、積分パワーオペレーター(正直なところ、適切なコーダーであれば10分で起動できます)またはマルチスレッドを標準に追加した方がよいでしょうか。私自身は、後者を使用することを好み、UNIXとWindowsでの異なる実装にこだわる必要はありません。

何千ものコレクションの標準ライブラリ(ハッシュ、btree、赤黒木、辞書、任意のマップなど)も見たいと思いますが、根拠は次のとおりです。

標準は、実装者とプログラマの間の協定です。

また、標準化団体の実装者の数は、プログラマー(または少なくとも機会費用を理解していないプログラマー)の数をはるかに上回ります。これらすべてが追加された場合、次の標準C++C++215x、コンパイラ開発者によって300年後に完全に実装されます。

とにかく、それは問題についての私の(むしろ膨大な)考えです。投票が質ではなく量に基づいて配られた場合、私はすぐに他のすべての人を水から吹き飛ばすでしょう。聞いてくれてありがとう :-)


2
FWIW、C ++が制約として「操作を実行するための1つの方法のみを提供する」とは考えていません。たとえばto_string、ラムダとラムダはどちらも、すでに実行できることには便利だからです。「操作を実行するための1つの方法のみ」を非常に大まかに解釈して、それらの両方を許可すると同時に、「aha!no!それは、正確に等価であるが、より長い時間のかかる代替とは微妙に異なる操作です!」これは確かにラムダに当てはまります。
スティーブジェソップ2012

@Steve、そう、それは私の側でひどく言い張られた。すべての委員会が同じガイドラインに従うのではなく、各委員会にはガイドラインがあると言う方がより正確です。clarifylの回答を調整
paxdiablo

2
ほんの1点(数点中):「どのコードモンキーも10分で起動する」。確かに、毎年100匹のコードモンキー(いい侮辱的な言葉、BTW)がそれを行っている場合(おそらく低い見積もりです)、1000分の無駄があります。とても効率的だと思いませんか?
ユルゲン・A.エアハルト

1
@Jürgen、それは侮辱することを意味するものではありませんでした(私は実際にラベルを特定の人に帰していなかったため)、それはpow実際にはあまりスキルを必要としないことを示すものにすぎません。確かに、私は標準が多くのスキル必要とする何かを提供することを望みます、そして努力が繰り返されなければならないならはるかに多くの無駄になる結果になります。
paxdiablo 2013年

2
@ eharo2、現在のテキストの「ハーフディーセントコーダー」を「コードモンキー」に置き換えるだけです。侮辱的だとは思わなかったが、用心深く、正直なところ、現在の言い回しは同じ考えに出くわすことが最善だと思った。
paxdiablo

41

固定幅の整数型の場合、入力ペアのほとんどすべてがとにかく型をオーバーフローします。可能な入力の大部分に対して有用な結果をもたらさない関数の標準化の使用は何ですか?

関数を有用にするためには、大整数型が必要であり、ほとんどの大整数ライブラリが関数を提供します。


編集:質問へのコメントで、static_rttiは「ほとんどの入力はオーバーフローを引き起こしますか?同じことがexpとdouble powにも当てはまります。誰も不満を感じていません。」これは誤りです。

脇に置いておきましょう。expそれは要点を外しているためです(実際には、私のケースがより強力になりますが)double pow(double x, double y)。(x、y)ペアのどの部分について、この関数は何か便利なことをしますか(つまり、単にオーバーフローまたはアンダーフローではありません)。

実際には、入力ペアのごく一部にのみ焦点を当てます。これpowは、私のポイントを証明するのに十分であるためです。xが正で、| y |の場合 <= 1の場合、powオーバーフローまたはアンダーフローしません。これは、すべての浮動小数点ペアのほぼ4分の1を構成します(非NaN浮動小数点数のちょうど半分が正で、非NaN浮動小数点数の半分未満の大きさが1未満です)。明らかに、他にも多くの入力ペアがありpow、有用な結果が得られますが、すべての入力の少なくとも4分の1であることを確認しました。

次に、固定幅(つまり、bignum以外)の整数べき関数を見てみましょう。どの部分の入力については、単にオーバーフローしないのですか?意味のある入力ペアの数を最大化するには、底に符号を付け、指数に符号を付けないようにする必要があります。基数と指数が両方ともnビット幅であると仮定します。意味のある入力の部分の境界を簡単に取得できます。

  • 指数が0または1の場合、任意の基数が意味を持ちます。
  • 指数が2以上の場合、2 ^(n / 2)より大きい基数は意味のある結果を生成しません。

したがって、2 ^(2n)個の入力ペアのうち、2 ^(n + 1)+ 2 ^(3n / 2)未満は有意な結果を生成します。最も一般的な使用法である32ビット整数を調べると、これは、入力ペアの1%の1/1000のオーダーの何かが単にオーバーフローしないことを意味します。


8
とにかく、これはすべて愚かです。関数が一部または多くの入力に対して有効ではないからといって、その機能があまり役に立たないわけではありません。
static_rtti 2011

2
@static_rtti:pow(x,y)| y |の場合、xのアンダーフローは発生しません。<= 1. アンダーフローが発生する非常に狭い入力バンド(大きなx、yはほぼ-1)がありますが、結果はその範囲で意味があります。
スティーブンキャノン

2
もっと考えれば、アンダーフローに同意する。ただし、これは問題には関係ないと思います。
static_rtti 2011

7
@ybungalobill:なぜそれを理由として選んだのですか?個人的には、多くの問題やプログラマー、ほとんどのプログラマーがおそらく作成するであろう素朴な実装よりも高速なハードウェア最適化バージョンを作成できる可能性などに役立つでしょう。あなたの基準は完全に恣意的であり、率直に言って、まったく無意味です。
static_rtti

5
@StephenCanon:明るい面で言えば、あなたの議論は明らかに整数の最適かつ最適な実装powが単なる小さなルックアップテーブルであることを示しています。:-)
R .. GitHub ICE HELPING ICEを停止

11

とにかくすべての整数の累乗をintで表す方法はないからです。

>>> print 2**-4
0.0625

3
有限サイズの数値型の場合、オーバーフローのために、その型内でその型のすべてのベキを表す方法はありません。しかし、否定的な力についてのあなたの主張はより有効です。
Chris Lutz

1
負の指数は、符号なし整数を指数として取るか、負の指数が入力として提供され、intが期待される出力である場合にゼロを返すことによって、標準実装が処理できるものと見なします。
Dan O

3
またはint pow(int base, unsigned int exponent)float pow(int base, int exponent)
別々に

4
負の整数を渡すことを、未定義の動作として宣言するだけで済みます。
Johannes Schaub-litb

2
現代のすべての実装では、それ以上のものint pow(int base, unsigned char exponent)は何とかしてとにかく役に立たない。基数は0または1で、指数は関係ありません。-1です。この場合、指数の最後のビットのみが関係するかbase >1 || base< -1exponent<256オーバーフローのペナルティが関係します。
MSalters 2010年

9

それは実際には興味深い質問です。私が議論で見つけなかった1つの引数は、引数の明白な戻り値の単純な欠如です。架空のint pow_int(int, int)関数が失敗する可能性がある方法を数えてみましょう。

  1. オーバーフロー
  2. 結果は未定義 pow_int(0,0)
  3. 結果を表現できません pow_int(2,-1)

関数には少なくとも2つの障害モードがあります。整数はこれらの値を表すことができません。これらの場合の関数の動作は標準で定義する必要があり、プログラマーは関数がこれらの場合をどのように処理するかを正確に認識する必要があります。

全体的に機能を除外することは、唯一の賢明なオプションのようです。プログラマは浮動小数点バージョンを使用でき、代わりにすべてのエラーレポートを利用できます。


しかし、最初の2つのケースはpow、float間にも適用されませんか?2つの大きなフロートを取り、一方をもう一方のパワーに引き上げると、オーバーフローが発生します。そしてpow(0.0, 0.0)、あなたの2番目のポイントと同じ問題を引き起こします。3番目のポイントは、整数と浮動小数点のべき乗関数の実装の唯一の違いです。
numbermaniac

7

短い答え:

pow(x, n)toがn自然数であるという特殊化は、多くの場合、時間パフォーマンスに役立ちます。しかし、標準ライブラリのジェネリックはこの目的のためにpow()驚くほど!)かなりうまく機能します。標準Cライブラリにできる限り少ないものを含めることは絶対に重要です。一方、C ++標準ライブラリやSTLに含まれることを完全に止めるものではありません。これは、組み込みプラットフォームでの使用を誰も計画していないことを確信しています。

さて、長い答えのために。

pow(x, n)多くの場合n、自然数に特化することで、はるかに高速にすることができます。私はこの関数の独自の実装を、作成するほとんどすべてのプログラムに使用する必要がありました(ただし、Cで多くの数学プログラムを作成しています)。特殊な操作はO(log(n))時間内に実行できますが、nサイズが小さい場合は、単純な線形バージョンの方が高速です。両方の実装は次のとおりです。


    // Computes x^n, where n is a natural number.
    double pown(double x, unsigned n)
    {
        double y = 1;
        // n = 2*d + r. x^n = (x^2)^d * x^r.
        unsigned d = n >> 1;
        unsigned r = n & 1;
        double x_2_d = d == 0? 1 : pown(x*x, d);
        double x_r = r == 0? 1 : x;
        return x_2_d*x_r;
    }
    // The linear implementation.
    double pown_l(double x, unsigned n)
    {
        double y = 1;
        for (unsigned i = 0; i < n; i++)
            y *= x;
        return y;
    }

x結果はpow(double x, unsigned n)doubleに収まるため、戻り値はdoubleのままにしpow(double, double)ます。)

(はい、pown再帰的であるが、最大スタックサイズがほぼ等しいので、スタックを破壊することは絶対に不可能であり、log_2(n)かつn整数である場合は、nあなたの約64の最大スタックサイズが得られる64ビットの整数であるなしのハードウェアは、このような極端を有しますメモリの制限。ただし、ハードウェアスタックを備えた一部の危険なPICを除き、3から8の関数呼び出しの深さのみです。

パフォーマンスに関してpow(double, double)は、園芸品種の能力に驚くでしょう。5歳のIBM Thinkpadで1億回のイテレーションをテストしました。xイテレーション数nは10で、このシナリオでpown_lは勝ちました。glibc pow()は12.0ユーザー秒pownかかり、7.4ユーザー秒pown_lかかり、6.5ユーザー秒しかかかりませんでした。ですから、それほど驚くことではありません。私たちは多かれ少なかれこれを期待していた。

次に、x定数(2.5に設定)にしてn、0から19まで1億回ループしました。今回は、予想外に、glibc powが勝利し、地滑りが発生しました。2.0ユーザー秒しかかかりませんでした。私pownは9.6秒、pown_l12.2秒かかりました。ここで何が起こったのですか?別のテストを行って調べました。

私はx100万に等しいだけで上記と同じことをしました。今回pownは9.6秒で勝ちました。pown_l12.2秒かかり、glibc捕虜は16.3秒かかりました。さて、それは明らかです!glibc は、低いpow場合xは3つよりもパフォーマンスxが高くなりますが、高い場合は最悪です。x高いpown_lときnは、低いときに最高のパフォーマンスを発揮し、高いときは最高のpownパフォーマンスを発揮しますx

したがって、3つの異なるアルゴリズムがあり、それぞれが適切な状況下で他のアルゴリズムよりも優れたパフォーマンスを発揮できます。つまり、最終的にどちらを使用するかは、をどのように使用するかによって異なりますがpow、適切なバージョンを使用すること価値があり、すべてのバージョンを使用することは便利です。実際、次のような関数を使用してアルゴリズムの選択を自動化することもできます。

double pown_auto(double x, unsigned n, double x_expected, unsigned n_expected) {
    if (x_expected < x_threshold)
        return pow(x, n);
    if (n_expected < n_threshold)
        return pown_l(x, n);
    return pown(x, n);
}

限りx_expectedn_expectedされている可能性が他のいくつかの注意点とともに、コンパイル時に決めた定数、その塩は、自動的に全体が削除されます最適化コンパイラの価値pown_auto関数呼び出しをし、3つのアルゴリズムの適切な選択と交換してください。(ここで、実際にこれを使用しようとする場合、上で書いたものをコンパイルしようとはしなかったので、おそらく少しいじる必要があります。;)

一方、glibc pow は機能し、glibcはすでに十分な大きさです。C標準は、さまざまな組み込みデバイスを含め、移植可能であることが想定されています(実際、どこにでもいる組み込み開発者は、glibcがすでに大きすぎることに同意しています)。すべての単純な数学関数について、すべてを含める必要がある場合は移植できません。役に立つかもしれない代替アルゴリズム。したがって、それがC標準にない理由です。

脚注:パフォーマンステストでは、-s -O2私のシステム(glilinux)でglibcをコンパイルするために使用された可能性があるものと同等かそれよりも劣ると思われる比較的寛大な最適化フラグ()を関数に与えたので、結果はおそらく公正。より厳密なテストを行うには、自分でglibcをコンパイルする必要がありますが、実際にはそうする気はありません。以前はGentooを使用していたので、タスクが自動化されている場合でも、どのくらい時間がかかったか覚えています。結果は、私にとって十分に決定的(またはむしろ決定的ではない)です。もちろん、これを自分で行うこともできます。

ボーナスラウンド:正確な整数出力が必要な場合、pow(x, n)すべての整数への特殊化が役立ちます。p ^ N要素を持つN次元配列にメモリを割り当てることを検討してください。p ^ Nを1つでもオフにすると、segfaultがランダムに発生する可能性があります。


再帰を取り除くと、スタックの割り当てに必要な時間を節約できると思います。そして、はい、私たちは捕虜がすべてを遅くしている状況にありました、そして私たちは私たち自身の捕虜を実行しなければなりません。
Sambatyon 2014年

「誰もそのような極端なメモリ制限はありません」は誤りです。多くの場合、PICの呼び出しスタックは最大3(例はPIC10F200)から8(例は16F722A)に制限されています(PICは関数呼び出しにハードウェアスタックを使用します)。
12431234123412341234123 2017

おお、それは残忍な笑い男だ。OK、そのため、それらのPICでは機能しません。
enigmaticPhysicist

整数ベースとパワーについて、質問が尋ねているように、コンパイラー(gccとclang)は(再帰的ではなく)反復的な実装からブランチレスループを簡単に生成します。これにより、の各ビットからの分岐予測ミスを回避できnます。 godbolt.org/z/L9Kb98。gccとclangは、再帰的な定義を単純なループに最適化できず、実際にはの各ビットで分岐しますn。(pown_iter(double,unsigned)まだ分​​岐しますが、x86 asmまたはC組み込み関数を使用して、分岐のないSSE2またはSSE4.1の実装が可能になるはずです。ただし、それでも再帰より優れています)
Peter Cordes

クラップ、今は念のためループベースのバージョンでベンチマークをやり直さなければならない。考えておく。
enigmaticPhysicist


3

世界は常に進化し、プログラミング言語も進化しています。Cの小数点TRの第四の部分は ¹にいくつかのより多くの機能が追加されます<math.h>。これらの関数の2つのファミリがこの質問に関心がある可能性があります。

  • pown浮動小数点数及びかかる機能、intmax_t指数。
  • powr機能は、すなわち、2つの浮動小数点数(takes x及びy)と計算をxpowerにyexp(y*log(x))

標準の人たちは最終的にこれらの機能を標準ライブラリに統合するのに十分に有用であると見なしたようです。ただし、合理的なのは、これらの関数がISO / IEC / IEEE 60559:2011規格で2進および10進浮動小数点数に対して推奨されていることです。C89の時点ではどの「標準」に従っていたかははっきりとは言えませんが、の将来の進化は、<math.h>おそらくISO / IEC / IEEE 60559標準の将来の進化によって大きく影響されます。

10進TRの4番目の部分はC2x(次​​のメジャーCリビジョン)には含まれず、後でオプション機能として含まれることに注意してください。TRのこの部分を将来のC ++リビジョンに含めるつもりはありません。


here進行中のドキュメントの一部はこちらにあります


使用している任意のもっともらしいの実装が存在するpownよりも指数大きいとはLONG_MAX、これまで使用してから値の異なるを得なければならないLONG_MAX、またはどこ値未満LONG_MINと異なる値が得られるはずLONG_MINintmax_t指数に使用するとどのようなメリットがありますか?
スーパーキャット2015

@supercatわかりません、すみません。
Morwenn、2015

標準を見ると、オプションの「crpown」関数も定義されているように見えるので、これを定義すると、正しく丸められたバージョンの「pown」になります。それ以外の場合、規格は必要な精度を指定していません。高速で適度に正確な「pown」を実装することは簡単ですが、すべてのケースで正しい丸めを保証することは、はるかに高価になる傾向があります。
スーパーキャット2015

2

おそらく、プロセッサのALUは整数に対してこのような関数を実装していなかったが、そのようなFPU命令があるためです(Stephenが指摘するように、実際にはペアです)。したがって、実際には、整数演算を使用して実装するよりも、doubleにキャストし、powをdoubleで呼び出し、オーバーフローをテストしてキャストバックする方が高速でした。

(1つには、対数は乗算の能力を減らしますが、整数の対数はほとんどの入力で多くの精度を失います)

スティーブンは、最近のプロセッサーではこれは真実ではないことは正しいですが、数学関数が選択されたときのC標準(C ++はC関数を使用しただけ)は20年前のものですか?


5
のFPU命令を使用する現在のアーキテクチャについては知りませんpow。x86には、関数の最初の部分として使用できるy log2 x命令(fyl2xpowがありpowますが、そのように記述された関数は、現在のハードウェアで実行するのに数百サイクルかかります。適切に作成された整数指数ルーチンは、数倍高速です。
スティーブンキャノン

私は、「数百」が正確であることを知りません。ほとんどの最近のCPUでは、fyl2xの次にf2xm1で約150サイクルであり、他の命令とパイプライン化されます。しかし、IMULは浮動小数点命令よりもはるかに高速化されているため、適切に調整された整数実装の方がはるかに高速になるはずです(最近)。ただし、C標準が作成された当時は、IMULはかなり高価であり、ループでの使用はFPUを使用するよりも時間がかかりました。
Ben Voigt

2
訂正を踏まえて私の投票を変更しました。それでも、(a)C標準が1999年に大幅な改訂(数学ライブラリの大幅な拡張を含む)を受けたこと、および(b)C標準が特定のプロセッサアーキテクチャに書き込まれていないこと、つまりまたはx86でのFPU命令の欠如は、C委員会が標準化することを選択した機能とは本質的に何の関係もありません。
スティーブンキャノン

確かにどのアーキテクチャにも関連付けられていませんが、整数乗算と比較したルックアップテーブル補間(通常、浮動小数点の実装に使用)の相対的なコストは、私が推測するすべてのアーキテクチャでほぼ同じように変化しました。
Ben Voigt

1

以下は、整数を含むあらゆる数値型で機能するpow()の本当にシンプルなO(log(n))実装です。

template<typename T>
static constexpr inline T pown(T x, unsigned p) {
    T result = 1;

    while (p) {
        if (p & 0x1) {
            result *= x;
        }
        x *= x;
        p >>= 1;
    }

    return result;
}

再帰を使用しないため、enigmaticPhysicistのO(log(n))実装よりも優れています。

また、次の理由により、ほとんどの場合、彼の線形実装よりも高速です(p>〜3である限り)。

  • 追加のメモリは必要ありません
  • ループごとに最大1.5倍の操作しか実行しません
  • ループごとに〜1.25倍のメモリ更新を実行するだけです

-2

実際のところ、そうです。

C ++ 11にはテンプレート化された実装がpow(int, int)あり、さらに一般的なケースがあります。http://en.cppreference.com/w/cpp/numeric/math/powの(7)を参照して ください。


編集:実際には「促進された」タイピングが使用されているため、純粋主義者はこれは正しくないと主張するかもしれません。いずれにしても、パラメーターの正しいint結果またはエラーが発生しintます。


2
これは誤りです。(7)オーバーロードはpow ( Arithmetic1 base, Arithmetic2 exp )、キャストされるdoublelong double、説明を読んだ場合:"7)オーバーロードのセット、または1-3でカバーされない算術型の引数のすべての組み合わせの関数テンプレート)。整数型の場合、それはdoubleにキャストされます。引数がlong doubleの場合、Promotedの戻り型もlong doubleになります。それ以外の場合、戻り型は常にdoubleです。
phuclv

ここで何が間違っていますか?私は単に言った、今日(以降C ++ 11)テンプレートPOW( )2010年のケースではなかった標準ライブラリ、である
ディマPasechnik

5
いいえ、そうではありません。テンプル酸塩はこれらのタイプをダブルまたはロングダブルに促進します。そのため、その下のダブルスで機能します。
Trismegistos

1
@Trismegistos引き続きintパラメータを使用できます。このテンプレートが存在しない場合、intパラメータを渡すと、intのビットが浮動小数点として解釈され、予期しない予期しない結果が発生します。同じことが混合入力値でも起こります。例えばpow(1.5f, 3)= 1072693280が、pow(1.5f, float(3))=3.375
マーク・Jeronimus

2
OPはを要求しましたint pow(int, int)が、C ++ 11はのみを提供しますdouble pow(int, int)。@phuclvの説明を参照してください。
xuhdev

-4

非常に単純な理由:

5^-2 = 1/25

STLライブラリのすべては、想像できる最も正確で堅牢なものに基づいています。確かに、intは(1/25から)ゼロに戻りますが、これは不正確な答えになります。

私は同意する、それはいくつかのケースでは奇妙です。


3
符号なしの2番目の引数を要求することは明らかに必要です。負でない整数の累乗のみを必要とする多くのアプリケーションがあります。
enigmaticPhysicist 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.