名前空間
変種
操作

logb, logbf, logbl

From cppreference.com
< c‎ | numeric‎ | math
 
 
 
共通の数学関数
関数
基本的な数学関数
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大/最小演算
(C99)
(C99)
指数関数
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
べき乗関数
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
三角関数と双曲線関数
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
最も近い整数浮動小数点数
(C99)(C99)(C99)
(C99)

(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮動小数点操作
(C99)(C99)
(C99)(C23)
logb
(C99)
縮小演算
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子および量子指数
Decimal再エンコーディング関数
総順序およびペイロード関数
分類
(C99)
(C99)
(C99)
(C23)
誤差関数とガンマ関数
(C99)
(C99)
(C99)
(C99)
マクロ定数
特殊な浮動小数点値
(C99)(C23)
引数と戻り値
エラーハンドリング
高速演算インジケータ
 
ヘッダー <math.h> で定義
float       logbf( float arg );
(1) (C99以降)
double      logb( double arg );
(2) (C99以降)
long double logbl( long double arg );
(3) (C99以降)
ヘッダー <tgmath.h> で定義
#define logb( arg )
(4) (C99以降)
1-3) 浮動小数点引数 arg から、基数に依存しない(unbiased)指数部分を抽出し、浮動小数点値として返します。
4) 型汎用マクロ: arglong double 型の場合、logbl が呼び出されます。そうでなく、arg が整数型または double 型の場合、logb が呼び出されます。それ以外の場合は、logbf が呼び出されます。

厳密には、基数に依存しない指数とは、非ゼロの arg に対して、logr|arg| (この関数によって浮動小数点値として返される)の符号付き整数部分です。ここで `r` は FLT_RADIX です。arg がサブナマル(subnormal)の場合、正規化されていたかのように扱われます。

目次

[編集] パラメータ

arg - floating-point value

[編集] 戻り値

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

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

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

[編集] エラー処理

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

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

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

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

[編集] 注釈

POSIX ではarg が ±0 の場合にポールエラーが発生することが要求されています。

logb が返す指数値は、正規化の要件が異なるため、frexp が返す指数値よりも常に 1 小さくなります。これは、logb によって返される指数 `e` の場合、|arg*r-e
|
1 と `r` の間(通常は 12 の間)になりますが、frexp によって返される指数 `e` の場合、|arg*2-e
|
0.51 の間になります。

[編集]

異なる浮動小数点分解関数を比較します。

#include <fenv.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
// #pragma STDC FENV_ACCESS ON
 
int main(void)
{
    double f = 123.45;
    printf("Given the number %.2f or %a in hex,\n", f, f);
 
    double f3;
    double f2 = modf(f, &f3);
    printf("modf() makes %.0f + %.2f\n", f3, f2);
 
    int i;
    f2 = frexp(f, &i);
    printf("frexp() makes %f * 2^%d\n", f2, i);
 
    i = logb(f);
    printf("logb()/logb() make %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i);
 
    // error handling
    feclearexcept(FE_ALL_EXCEPT);
    printf("logb(0) = %f\n", logb(0));
    if (fetestexcept(FE_DIVBYZERO))
        puts("    FE_DIVBYZERO raised");
}

実行結果の例

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

[編集] 参照

  • C23標準 (ISO/IEC 9899:2024)
  • 7.12.6.11 The logb functions (p: TBD)
  • 7.25 Type-generic math <tgmath.h> (p: TBD)
  • F.10.3.11 The logb functions (p: TBD)
  • C17標準 (ISO/IEC 9899:2018)
  • 7.12.6.11 The logb functions (p: 179-180)
  • 7.25 型総称数学関数 <tgmath.h> (p: 373-375)
  • F.10.3.11 The logb functions (p: 381)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.12.6.11 The logb functions (p: 246)
  • 7.25 型総称数学関数 <tgmath.h> (p: 373-375)
  • F.10.3.11 The logb functions (p: 522)
  • C99標準 (ISO/IEC 9899:1999)
  • 7.12.6.11 The logb functions (p: 227)
  • 7.22 型総称数学関数 <tgmath.h> (p: 335-337)
  • F.9.3.11 The logb functions (p: 459)

[編集] 関連項目

数を仮数部と2のべき乗に分割する
(関数) [編集]
(C99)(C99)(C99)
与えられた数の指数を抽出する
(関数) [編集]
(C99)(C99)(C99)(C99)(C99)(C99)
FLT_RADIXのべき乗に数を効率的に掛ける
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)