名前空間
変種
操作

std::scalbn, std::scalbln

提供: 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)
 
ヘッダ <cmath> で定義
float       scalbn( float x, int exp );
(1) (C++11およびそれ以降)
double      scalbn( double x, int exp );
(2) (C++11およびそれ以降)
long double scalbn( long double x, int exp );
(3) (C++11およびそれ以降)
double      scalbn( Integral x, int exp );
(4) (C++11およびそれ以降)
float       scalbln( float x, long exp );
(5) (C++11およびそれ以降)
double      scalbln( double x, long exp );
(6) (C++11およびそれ以降)
long double scalbln( long double x, long exp );
(7) (C++11およびそれ以降)
double      scalbln( Integral x, long exp );
(8) (C++11およびそれ以降)
1-3,5-7) 浮動小数点値 xFLT_RADIXexp 乗を掛けます。
4,8) 任意の整数型の引数を受け取るオーバーロード集合または関数テンプレート。 (2) または (6) と同等です (引数は double にキャストされます)。

目次

[編集] 引数

x - 浮動小数点値
exp - 整数値

[編集] 戻り値

エラーが発生しなければ、 FLT_RADIXexp 乗を掛けた x (x×FLT_RADIXexp
) が返されます。

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

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

[編集] エラー処理

math_errhandling で規定されている通りにエラーが報告されます。

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

  • 値域エラーが発生しなければ、 FE_INEXACT が発生することはありません (結果は正確です)。
  • 値域エラーが発生しなければ、 現在の丸めモードは無視されます。
  • x が ±0 であれば、それが変更されずに返されます。
  • x が ±∞ であれば、それが変更されずに返されます。
  • exp が 0 であれば、 x が変更されずに返されます。
  • x が NaN であれば、 NaN が返されます。

[編集] ノート

2進数 (FLT_RADIX2) のシステムでは、 std::scalbnstd::ldexp と同等です。

std::scalbn および std::scalbln は演算を効率的に行うと規定されてはいませんが、多くの処理系では、算術演算子を使用して2の乗数を乗算または除算するよりも非効率的です。

関数名の由来は「new scalb」です。 scalb は非標準の古い関数で、第2引数が浮動小数点型でした。

scalbln 関数は、可能な最も小さな浮動小数点値を最も大きな有限の浮動小数点値にスケールするために必要な係数が 32767 (標準が保証している INT_MAX の値) より大きくなる可能性があるために、提供されています。 特に、 80 ビットの long double に対しては、係数は 32828 になります。

GNU の実装は math_errhandling にかかわらず errno を設定しません。

[編集]

#include <iostream>
#include <cmath>
#include <cerrno>
#include <cstring>
#include <cfenv>
 
#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

[編集] 関連項目

数値を仮数と 2 の指数に分解します
(関数) [edit]
数値に 2 の累乗を掛けます
(関数) [edit]