std::logb, std::logbf, std::logbl
| ヘッダー <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オーバーロード (C++26以降) |
||
| ヘッダー <simd> で定義 |
||
| template< /*math-floating-point*/ V > constexpr /*deduced-simd-t*/<V> |
(S) | (C++26以降) |
| 追加のオーバーロード (C++11以降) |
||
| ヘッダー <cmath> で定義 |
||
template< class Integer > double logb ( Integer num ); |
(A) | (C++23 以降 constexpr) |
std::logb のオーバーロードを提供します。(C++23 以降)|
S) SIMD オーバーロードは、v_num に対して要素ごとの
std::logb を実行します。
|
(C++26以降) |
|
A) すべての整数型に対する追加のオーバーロードが提供されます。これらは double として扱われます。
|
(C++11以降) |
形式的には、非正規化された指数は、ゼロでない num について logr|num| の符号付き整数部分(この関数によって浮動小数点値として返される)です。ここで、r は std::numeric_limits<T>::radix であり、T は num の浮動小数点型です。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
| は 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 のべき乗を掛ける (関数) |
| C のドキュメント (logb について)
| |