Namespaces
Variants

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

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
scalbn scalbln
(C++11) (C++11)
(C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
定義済みヘッダー <cmath>
int exponent
(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 ( /* floating-point-type */ num, int exp ) ;
(C++23以降)
float scalbnf ( float num, int exp ) ;
(2) (C++11以降)
(constexprはC++23以降)
long double scalbnl ( long double num, int exp ) ;
(3) (C++11以降)
(constexprはC++23以降)
long 指数部
(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 ( /* floating-point-type */ num, long exp ) ;
(C++23以降)
float scalblnf ( float num, long exp ) ;
(5) (C++11以降)
(constexpr C++23以降)
long double scalblnl ( long double num, long exp ) ;
(6) (C++11以降)
(constexpr C++23以降)
ヘッダー <cmath> で定義
template < class Integer >
double scalbn ( Integer num, int exp ) ;
(A) (C++11以降)
(constexpr C++23以降)
template < class Integer >
double scalbln ( Integer num, long exp ) ;
(B) (C++11以降)
(constexpr C++23以降)
1-6) 浮動小数点値 num FLT_RADIX exp 乗で乗算します。 ライブラリは、 std::scalbn および std::scalbln のオーバーロードを、パラメータ num の型としてすべてのcv修飾されていない浮動小数点型に対して提供します。 (C++23以降)
A,B) すべての整数型に対して追加のオーバーロードが提供されており、これらは double として扱われます。

目次

パラメータ

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

戻り値

エラーが発生しなかった場合、 num FLT_RADIX exp 乗を乗じた値 ( num×FLT_RADIX exp
) が返されます。

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

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

エラーハンドリング

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

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

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

注記

バイナリシステム( FLT_RADIX 2 の場合)では、 std::scalbn std::ldexp と等価です。

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

この関数名は「new scalb」を意味し、 scalb は第二引数が浮動小数点型であった古い非標準関数を指します。

std::scalbln 関数が提供されている理由は、最小の正の浮動小数点値から最大の有限値へスケーリングするために必要な係数が、標準で保証されている INT_MAX である32767よりも大きくなる可能性があるためです。特に、80ビットの long double の場合、その係数は32828です。

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

追加のオーバーロードは (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)
              << " (最小の正の非正規化 double)\n"
              << "scalbn(nextafter(1,0), 1024) = "
              << std::scalbn(std::nextafter(1,0), 1024)
              << " (最大の有限 double)\n";
    // 特殊な値
    std::cout << "scalbn(-0, 10) = " << std::scalbn(-0.0, 10) << '\n'
              << "scalbn(-Inf, -1) = " << std::scalbn(-INFINITY, -1) << '\n';
    // エラー処理
    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 が発生\n";
}

出力例:

scalbn(7, -4) = 0.4375
scalbn(1, -1074) = 4.94066e-324 (最小の正の非正規化 double)
scalbn(nextafter(1,0), 1024) = 1.79769e+308 (最大の有限 double)
scalbn(-0, 10) = -0
scalbn(-Inf, -1) = -inf
scalbn(1, 1024) = inf
    errno == ERANGE: 数値結果が範囲外です
    FE_OVERFLOW が発生

関連項目

(C++11) (C++11)
数値を仮数と基数 2 の指数に分解する
(関数)
(C++11) (C++11)
数値に 2 の整数乗を乗算する
(関数)