名前空間
変種
操作

std::log(std::complex)

From cppreference.com
< cpp‎ | numeric‎ | complex
 
 
 
 
ヘッダ <complex> で定義
template< class T >
std::complex<T> log( const std::complex<T>& z );

複素数 z の(自然対数、底 e)複素対数を計算します。分岐は負の実軸に沿って定義されます。

目次

[edit] パラメータ

z - complex value

[edit] 戻り値

エラーが発生しない場合、 z の自然対数(複素数)が返されます。戻り値の範囲は、虚軸に沿った区間 [−iπ, +iπ] の帯状領域であり、実軸に沿っては数学的に有界ではありません。

[edit] エラー処理と特殊値

エラーは math_errhandling と一致する方法で報告される。

実装がIEEE浮動小数点演算をサポートしている場合、

  • この関数は、虚部の符号を考慮して分岐切断上で連続する。
  • std::log(std::conj(z)) == std::conj(std::log(z))
  • もし z(-0,+0) の場合、結果は (-∞,π) となり、 FE_DIVBYZERO が発生します。
  • もし z(+0,+0) の場合、結果は (-∞,+0) となり、 FE_DIVBYZERO が発生します。
  • もし z(x,+∞) (任意の有限な x に対して)の場合、結果は (+∞,π/2) となります。
  • もし z(x,NaN) (任意の有限な x に対して)の場合、結果は (NaN,NaN) となり、 FE_INVALID が発生する可能性があります。
  • もし z(-∞,y) (任意の有限な正の y に対して)の場合、結果は (+∞,π) となります。
  • もし z(+∞,y) (任意の有限な正の y に対して)の場合、結果は (+∞,+0) となります。
  • もし z(-∞,+∞) の場合、結果は (+∞,3π/4) となります。
  • もし z(+∞,+∞) の場合、結果は (+∞,π/4) となります。
  • もし z(±∞,NaN) の場合、結果は (+∞,NaN) となります。
  • z(NaN,y) (任意の有限 y) の場合、結果は (NaN,NaN) になり、FE_INVALID が発生する可能性があります。
  • もし z(NaN,+∞) の場合、結果は (+∞,NaN) となります。
  • z(NaN,NaN) の場合、結果は (NaN,NaN)

[edit] 注記

極座標成分 (r,θ) を持つ複素数 z の自然対数は、 ln r + i(θ+2nπ) に等しく、主値は ln r + iθ です。

この関数のセマンティクスは、C言語の関数 clog と一貫性があるように意図されています。

[edit]

#include <cmath>
#include <complex>
#include <iostream>
 
int main()
{
    std::complex<double> z {0.0, 1.0}; // r = 1, θ = pi / 2
    std::cout << "2 * log" << z << " = " << 2.0 * std::log(z) << '\n';
 
    std::complex<double> z2 {sqrt(2.0) / 2, sqrt(2.0) / 2}; // r = 1, θ = pi / 4
    std::cout << "4 * log" << z2 << " = " << 4.0 * std::log(z2) << '\n';
 
    std::complex<double> z3 {-1.0, 0.0}; // r = 1, θ = pi
    std::cout << "log" << z3 << " = " << std::log(z3) << '\n';
    std::complex<double> z4 {-1.0, -0.0}; // the other side of the cut
    std::cout << "log" << z4 << " (the other side of the cut) = " << std::log(z4) << '\n';
}

実行結果の例

2 * log(0,1) = (0,3.14159)
4 * log(0.707107,0.707107) = (0,3.14159)
log(-1,0) = (0,3.14159)
log(-1,-0) (the other side of the cut) = (0,-3.14159)

[edit] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 2597 C++98 仕様で符号付きゼロの虚部が不適切に扱われている 誤った要件が削除された

[edit] 関連情報

複素数の常用対数、分枝切断は負の実軸に沿う
(関数テンプレート) [編集]
複素数の底eの指数関数
(関数テンプレート) [編集]
(C++11)(C++11)
自然対数 (e を底とする) を計算する (ln(x))
(関数) [編集]
valarrayの各要素に関数std::logを適用する
(function template) [編集]
English 日本語 中文(简体) 中文(繁體)