名前空間
変種
操作

logb, logbf, logbl

提供: cppreference.com
< c‎ | numeric‎ | math
 
 
 
一般的な数学関数
関数
基本操作
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)(C99)(C99)
指数関数
(C99)
(C99)
(C99)
(C99)
冪関数
(C99)
(C99)
三角関数と双曲線関数
(C99)
(C99)
(C99)
誤差関数とガンマ関数
(C99)
(C99)
(C99)
(C99)
最も近い整数
(C99)(C99)(C99)
(C99)
(C99)(C99)(C99)
浮動小数点操作関数
(C99)(C99)
(C99)
logb
(C99)
分類
(C99)
(C99)
(C99)
(C99)(C99)
マクロ定数
 
ヘッダ <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 からバイアスされていない基数非依存な指数の値を取り出し、それを浮動小数点値として返します。
4) 型総称マクロ。 arglong double 型の場合は logbl が呼ばれます。 そうでなく、 arg が整数型または double 型の場合は logb が呼ばれます。 そうでなければ logbf が呼ばれます。

形式的には、バイアスされていない指数は、非ゼロの arg について、 (浮動小数点値としてこの関数によって返される) log
r
|arg|
の符号付き整数部です。 ただし rFLT_RADIX です。 arg が非正規化数の場合は正規化されたものとして扱われます。

目次

[編集] 引数

arg - 浮動小数点値

[編集] 戻り値

エラーが発生しなければ、 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 <stdio.h>
#include <math.h>
#include <float.h>
#include <fenv.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

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.12.6.11 The logb functions (p: 246)
  • 7.25 Type-generic math <tgmath.h> (p: 373-375)
  • F.10.3.11 The logb functions (p: 522)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.12.6.11 The logb functions (p: 227)
  • 7.22 Type-generic math <tgmath.h> (p: 335-337)
  • F.9.3.11 The logb functions (p: 459)

[編集] 関連項目

数値を仮数と 2 の指数に分解します
(関数) [edit]
(C99)(C99)(C99)
指定された数値の指数を取り出します
(関数) [edit]
(C99)(C99)(C99)(C99)(C99)(C99)
数値と FLT_RADIX の累乗の乗算を効率良く計算します
(関数) [edit]