名前空間
変種
操作

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

From cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
 
ヘッダー <cmath> で定義
(1)
float        logb ( float num );
double      logb ( double num );
long double logb ( long double num );
(C++23まで)
constexpr /*浮動小数点数型*/
            logb ( /*浮動小数点型*/ 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-unqualified 浮動小数点型に対する std::logb のオーバーロードを提供します。(C++23 以降)
S) SIMD オーバーロードは、v_num に対して要素ごとの std::logb を実行します。
(定義については、math-floating-point および deduced-simd-t を参照してください。)
(C++26以降)
A) すべての整数型に対する追加のオーバーロードが提供されます。これらは double として扱われます。
(C++11以降)

形式的には、非正規化された指数は、ゼロでない num について logr|num| の符号付き整数部分(この関数によって浮動小数点値として返される)です。ここで、rstd::numeric_limits<T>::radix であり、Tnum の浮動小数点型です。num がサブノーマルな場合、正規化されたかのように扱われます。

目次

[編集] パラメータ

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

[編集] 戻り値

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

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

If a pole error occurs, -HUGE_VAL, -HUGE_VALF, or -HUGE_VALL is returned.

[編集] エラー処理

エラーは 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
|
1r(通常は 12)の間になりますが、std::frexp によって返される指数 e については、|num*2-e
|
0.51 の間になります。

追加のオーバーロードは、(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 のべき乗を掛ける
(関数) [編集]
C のドキュメントlogb について)
English 日本語 中文(简体) 中文(繁體)