s、s、およびs のcmath
呼び出しのみstd::abs
を含む標準準拠のコードでは、違いはありません。ただし、さまざまなヘッダー ファイルのセットを含めて呼び出すときに、さまざまな型で返される型を調べることは有益です。float
double
long double
std::abs
私のシステムでstd::abs(-42)
は、 はdouble
を含めたが を含めcmath
なかっcstdlib
たint
場合、 を含めた場合cstdlib
であり、どちらも含めなかった場合はコンパイル エラーが発生します。逆に、含めたが含めていないstd::abs(-42.0)
場合はコンパイル エラー (あいまいなオーバーロード) が発生し、どちらも含めていない場合は別のコンパイル エラー (聞いたことがない) が発生します。cstdlib
cmath
std::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を返す可能性があります。(または、を渡すときに整数型を与えると思っていたのかもしれません。その後、私のコンパイラがプロモーションとオーバーロードの解決を正しく行ったと仮定すると、 を含めないようにした方がよいでしょう。)cstdlib
std::abs('x')
int
std::abs
short
cmath
double precise_sine = std::sin(myfloat)
また、コードのようなものが不正確な結果をもたらす理由を解明しようとして、過去にあまりにも多くの時間を費やしてきました。私はこの種のサプライズに時間を無駄にするのが好きではないので、標準 C 関数のオーバーロードされたバリアントを .NET で避ける傾向がありますnamespace std
。つまり、返したい時、アウトしたい時、アウトしたい::fabs
時に使います。が欲しいとき、が欲しいとき、が欲しいときも同様です。double
::fabsf
float
::fabsl
long double
::abs
int
::absl
long
::absll
long long