名前空間
変種
操作

std::scalbn, std::scalbnf, std::scalbnl, std::scalbln, std::scalblnf, std::scalblnl

From cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
共通の数学関数
関数
基本的な数学関数
(C++11)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
指数関数
(C++11)
(C++11)

(C++11)
(C++11)
べき乗関数
(C++11)
(C++11)
三角関数と
双曲線関数
(C++11)
(C++11)
(C++11)

誤差関数とガンマ関数
(C++11)
(C++11)
(C++11)
(C++11)
最近接整数への浮動小数点数操作
(C++11)(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
浮動小数点数の操作関数
scalbnscalbln
(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)
(C++11)
分類と比較
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
マクロ定数
分類
(C++11)(C++11)(C++11)(C++11)(C++11)


 
ヘッダー <cmath> で定義
指数
(1)
float       scalbn ( float num, int exp );

double      scalbn ( double num, int exp );

long double scalbn ( long double num, int exp );
(C++11以降)
(C++23まで)
constexpr /* floating-point-type */
            scalbn ( /* 浮動小数点型 */ num, int exp );
(C++23から)
float       scalbnf( float num, int exp );
(2) (C++11以降)
(C++23 以降 constexpr)
long double scalbnl( long double num, int exp );
(3) (C++11以降)
(C++23 以降 constexpr)
long exponent
(4)
float       scalbln ( float num, long exp );

double      scalbln ( double num, long exp );

long double scalbln ( long double num, long exp );
(C++11以降)
(C++23まで)
constexpr /* floating-point-type */
            scalbln ( /* 浮動小数点型 */ num, long exp );
(C++23から)
float       scalblnf( float num, long exp );
(5) (C++11以降)
(C++23 以降 constexpr)
long double scalblnl( long double num, long exp );
(6) (C++11以降)
(C++23 以降 constexpr)
ヘッダー <cmath> で定義
template< class Integer >
double scalbn( Integer num, int exp );
(A) (C++11以降)
(C++23 以降 constexpr)
template< class Integer >
double scalbln( Integer num, long exp );
(B) (C++11以降)
(C++23 以降 constexpr)
1-6) 浮動小数点値 numFLT_RADIXexp 乗を掛けます。ライブラリは、num パラメータの型として、すべての cv 修飾されていない浮動小数点型に対する std::scalbn および std::scalbln のオーバーロードを提供します。(C++23 以降)
A,B) すべての整数型に対する追加のオーバーロードが提供されており、これらは double として扱われます。

目次

[編集] パラメータ

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

[編集] 戻り値

エラーが発生しない場合、 numFLT_RADIXexp 乗を掛けた値 (num×FLT_RADIXexp
) が返されます。

オーバーフローによる範囲エラーが発生した場合、±HUGE_VAL±HUGE_VALF、または ±HUGE_VALL のいずれかを返します。

アンダーフローによる範囲エラーが発生した場合、正しい結果(丸め後)が返されます。

[編集] エラー処理

エラーは math_errhandling で指定された通りに報告される。

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

  • 範囲エラーが発生しない限り、 FE_INEXACT は決して設定されません(結果は正確です)。
  • 範囲エラーが発生しない限り、 現在の丸めモード は無視されます。
  • num が ±0 の場合、変更されずに返されます。
  • num が ±∞ の場合、変更されずに返されます。
  • exp が 0 の場合、 num は変更されずに返されます。
  • num が NaN の場合、NaN が返されます。

[編集] 注意

バイナリシステム(FLT_RADIX2 の場合)では、std::scalbnstd::ldexp と同等です。

std::scalbn および std::scalbln は効率的に操作を実行するように指定されていますが、多くの実装では、算術演算子を使用した 2 のべき乗による乗算または除算よりも効率が悪いです。

関数名は「new scalb」の略で、scalb は、2番目の引数が浮動小数点型であった古い非標準関数です。

std::scalbln 関数は、最小の正の浮動小数点値から最大の有限値までのスケールに必要な係数が、標準で保証されている INT_MAX である 32767 を超える可能性があるため提供されています。特に、80ビットの long double では、係数は 32828 です。

GNU 実装では、math_errhandling にかかわらず errno は設定されません。

追加のオーバーロードは、(A,B) とまったく同じように提供される必要はありません。整数型の引数 num に対して、

  • std::scalbn(num, exp)std::scalbn(static_cast<double>(num), exp) と同じ効果を持つことを保証するだけで十分です。
  • std::scalbln(num, exp)std::scalbln(static_cast<double>(num), exp) と同じ効果を持つことを保証するだけで十分です。

[編集]

#include <cerrno>
#include <cfenv>
#include <cmath>
#include <cstring>
#include <iostream>
// #pragma STDC FENV_ACCESS ON
 
int main()
{
    std::cout << "scalbn(7, -4) = " << std::scalbn(7, -4) << '\n'
              << "scalbn(1, -1074) = " << std::scalbn(1, -1074)
              << " (minimum positive subnormal double)\n"
              << "scalbn(nextafter(1,0), 1024) = "
              << std::scalbn(std::nextafter(1,0), 1024)
              << " (largest finite double)\n";
 
    // special values
    std::cout << "scalbn(-0, 10) = " << std::scalbn(-0.0, 10) << '\n'
              << "scalbn(-Inf, -1) = " << std::scalbn(-INFINITY, -1) << '\n';
 
    // error handling
    errno = 0;
    std::feclearexcept(FE_ALL_EXCEPT);
 
    std::cout << "scalbn(1, 1024) = " << std::scalbn(1, 1024) << '\n';
 
    if (errno == ERANGE)
        std::cout << "    errno == ERANGE: " << std::strerror(errno) << '\n';
    if (std::fetestexcept(FE_OVERFLOW))
        std::cout << "    FE_OVERFLOW raised\n";
}

実行結果の例

scalbn(7, -4) = 0.4375
scalbn(1, -1074) = 4.94066e-324 (minimum positive subnormal double)
scalbn(nextafter(1,0), 1024) = 1.79769e+308 (largest finite double)
scalbn(-0, 10) = -0
scalbn(-Inf, -1) = -inf
scalbn(1, 1024) = inf
    errno == ERANGE: Numerical result out of range
    FE_OVERFLOW raised

[編集] 関連項目

(C++11)(C++11)
数値を仮数部と2を底とする指数部に分解する
(関数) [編集]
(C++11)(C++11)
数値に2の整数乗を掛ける
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)