4

関連する質問がありますが、この質問には答えていないと思います。

ドキュメントを見るとstd::absstd::fabsまったく同じ動作をしているようです。個人的なメモとして、(注を参照) の定義std::fabsのあいまいさを軽減するため、それが望ましいように思われます。std::abs(int)<cstdlib>

だから私の質問は:潜在的なあいまいさに加えて、浮動小数点値に適用される場合と適用される場合にstd::abs(int)違いはありますか?std::absstd::fabs

4

2 に答える 2

7

s、s、およびs のcmath呼び出しのみstd::absを含む標準準拠のコードでは、違いはありません。ただし、さまざまなヘッダー ファイルのセットを含めて呼び出すときに、さまざまな型で返される型を調べることは有益です。floatdoublelong doublestd::abs

私のシステムでstd::abs(-42)は、 はdoubleを含めたが を含めcmathなかっcstdlibint場合、 を含めた場合cstdlibであり、どちらも含めなかった場合はコンパイル エラーが発生します。逆に、含めたが含めていないstd::abs(-42.0)場合はコンパイル エラー (あいまいなオーバーロード) が発生し、どちらも含めていない場合は別のコンパイル エラー (聞いたことがない) が発生します。cstdlibcmathstd::abs

私のプラットフォームでstd::abs('x')は、doubleを含めcmathた場合、またはint含めたが含めcstdlibなかった場合に が表示されcmathます。についても同様ですshort int。署名は問題ではないようです。

私のプラットフォームでは、complexヘッダーによって整数オーバーロードと浮動小数点オーバーロードの両方std::absが宣言されるようです。これが義務付けられているかどうかはわかりません。std::abs(1e222)おそらく、間違った標準ヘッダーのセットが含まれている無限を返す合理的なプラットフォームを見つけることができます。


「プログラムのヘッダーを忘れた」場合の通常の結果は、動作の暗黙の変更ではなく、未定義のシンボルを訴えるコンパイルの失敗です。std::absただし、 を使用すると、結果は、忘れstd::abs(42)た場合は a を返すかdouble、忘れていない場合はanを返す可能性があります。(または、を渡すときに整数型を与えると思っていたのかもしれません。その後、私のコンパイラがプロモーションとオーバーロードの解決を正しく行ったと仮定すると、 を含めないようにした方がよいでしょう。)cstdlibstd::abs('x')intstd::absshortcmath

double precise_sine = std::sin(myfloat)また、コードのようなものが不正確な結果をもたらす理由を解明しようとして、過去にあまりにも多くの時間を費やしてきました。私はこの種のサプライズに時間を無駄にするのが好きではないので、標準 C 関数のオーバーロードされたバリアントを .NET で避ける傾向がありますnamespace std。つまり、返したい時、アウトしたい時、アウトしたい::fabs時に使います。が欲しいとき、が欲しいとき、が欲しいときも同様です。double::fabsffloat::fabsllong double::absint::absllong::abslllong long

于 2015-12-10T04:46:26.997 に答える