std::logb, std::logbf, std::logbl
提供: cppreference.com
ヘッダ <cmath> で定義 | ||
float logb (float arg ); float logbf(float arg ); | (1) | (C++11以上) |
double logb (double arg ); | (2) | (C++11以上) |
longdouble logb (longdouble arg ); longdouble logbl(longdouble arg ); | (3) | (C++11以上) |
double logb ( 整数型 arg ); | (4) | (C++11以上) |
1-3) 浮動小数点引数
arg
からバイアスされていない基数非依存な指数の値を取り出し、それを浮動小数点値として返します。形式的には、バイアスされていない指数は、非ゼロの arg
について、 (浮動小数点値としてこの関数によって返される) log
r|arg| の符号付き整数部です。 ただし r
は std::numeric_limits<T>::radix で、 T
は arg
の浮動小数点型です。 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 の場合、極エラーが発生することを要求しています。
std::logb
によって返される指数の値は、 std::frexp によって返される指数の値より常に 1 小さくなります。 これは正規化の要件が異なるためです。 std::logb
によって返される指数 e
の場合、 |arg*r-e
| は 1 と r
(一般的には 1 と 2) の間になりますが、 std::frexp によって返される指数 e
の場合、 |arg*2-e
| は 0.5 と 1 の間になります。
[編集]例
異なる浮動小数点分解関数を比較します
Run this code
#include <iostream>#include <cmath>#include <limits>#include <cfenv>#pragma STDC FENV_ACCESS ONint 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'; // エラー処理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 の累乗を掛けます (関数) |
logb の C言語リファレンス |