Namespaces
Variants

std:: logb, std:: logbf, std:: logbl

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
logb
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
ヘッダーで定義 <cmath>
(1)
float logb ( float num ) ;

double logb ( double num ) ;

long double logb ( long double num ) ;
(C++23まで)
constexpr /*floating-point-type*/
logb ( /*floating-point-type*/ num ) ;
(C++23から)
float logbf ( float num ) ;
(2) (C++11から)
(C++23からconstexpr)
long double logbl ( long double num ) ;
(3) (C++11から)
(C++23からconstexpr)
ヘッダーで定義 <simd>
template < /*math-floating-point*/ V >

constexpr /*deduced-simd-t*/ < V >

logb ( const V & v_num ) ;
(S) (C++26から)
ヘッダーで定義 <cmath>
template < class Integer >
double logb ( Integer num ) ;
(A) (C++23からconstexpr)
1-3) 浮動小数点引数 num からバイアスのない基数非依存の指数部の値を抽出し、浮動小数点値として返します。 ライブラリは、パラメータの型としてすべてのcv修飾されていない浮動小数点型に対する std::logb のオーバーロードを提供します。 (C++23以降)
S) SIMDオーバーロードは v_num に対して要素ごとに std::logb を実行します。
(詳細は math-floating-point および deduced-simd-t を参照)
(C++26以降)
A) すべての整数型に対して追加のオーバーロードが提供されており、これらは double として扱われます。
(C++11以降)

形式的には、非バイアス指数はゼロでない num に対して log r |num| の符号付き整数部(この関数では浮動小数点数値として返される)であり、ここで r std:: numeric_limits < T > :: radix であり、 T num の浮動小数点型である。 num が非正規化数の場合、正規化されたものとして扱われる。

目次

パラメータ

num - 浮動小数点または整数値

戻り値

エラーが発生しない場合、 num の不偏指数が符号付き浮動小数点値として返されます。

定義域エラーが発生した場合、実装定義の値が返されます。

極エラーが発生した場合、 -HUGE_VAL -HUGE_VALF または -HUGE_VALL が返されます。

エラーハンドリング

エラーは math_errhandling で指定された通りに報告されます。

num がゼロの場合、定義域または値域エラーが発生する可能性があります。

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

  • num が±0の場合、-∞が返され、 FE_DIVBYZERO が発生します。
  • num が±∞の場合、+∞が返されます。
  • num がNaNの場合、NaNが返されます。
  • その他のすべての場合、結果は正確であり( FE_INEXACT は発生しません)、 現在の丸めモード は無視されます。

注記

POSIXは num が±0の場合、極エラーが発生することを要求しています。

std::logb が返す指数の値は、正規化要件の違いにより常に std::frexp が返す指数より1小さくなります: std::logb が返す指数 e の場合、 |num*r -e
|
1 から r の間(通常は 1 から 2 の間)ですが、 std::frexp が返す指数 e の場合、 |num*2 -e
|
0.5 から 1 の間になります。

追加のオーバーロードは (A) と完全に同一である必要はありません。整数型の引数 num に対して、 std :: logb ( num ) std :: logb ( static_cast < double > ( num ) ) と同じ効果を持つことを保証するのに十分なものであればよいのです。

様々な浮動小数点分解関数を比較します:

#include <cfenv>
#include <cmath>
#include <iostream>
#include <limits>
// #pragma STDC FENV_ACCESS ON
int main()
{
    double f = 123.45;
    std::cout << "Given the number " << f << " or " << std::hexfloat
              << f << std::defaultfloat << " in hex,\n";
    double f3;
    double f2 = std::modf(f, &f3);
    std::cout << "modf() makes " << f3 << " + " << f2 << '\n';
    int i;
    f2 = std::frexp(f, &i);
    std::cout << "frexp() makes " << f2 << " * 2^" << i << '\n';
    i = std::ilogb(f);
    std::cout << "logb()/ilogb() make " << f / std::scalbn(1.0, i) << " * "
              << std::numeric_limits<double>::radix
              << "^" << std::ilogb(f) << '\n';
    // error handling
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "logb(0) = " << std::logb(0) << '\n';
    if (std::fetestexcept(FE_DIVBYZERO))
        std::cout << "    FE_DIVBYZERO raised\n";
}

出力例:

Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123 + 0.45
frexp() makes 0.964453 * 2^7
logb()/ilogb() make 1.92891 * 2^6
logb(0) = -Inf
    FE_DIVBYZERO raised

関連項目

(C++11) (C++11)
数値を仮数と基数 2 の指数に分解する
(関数)
(C++11) (C++11) (C++11)
数値の指数を抽出する
(関数)
(C++11) (C++11) (C++11) (C++11) (C++11) (C++11)
数値に FLT_RADIX の累乗を乗算する
(関数)