名前空間
変種
操作

scalbn, scalbnf, scalbnl, scalbln, scalblnf, scalblnl

From cppreference.com
< c‎ | numeric‎ | math
 
 
 
共通の数学関数
関数
基本的な数学関数
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大/最小演算
(C99)
(C99)
指数関数
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
べき乗関数
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
三角関数と双曲線関数
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
最も近い整数浮動小数点数
(C99)(C99)(C99)
(C99)

(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮動小数点操作
scalbnscalbln
(C99)(C99)
(C99)(C23)
(C99)
縮小演算
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子および量子指数
Decimal再エンコーディング関数
総順序およびペイロード関数
分類
(C99)
(C99)
(C99)
(C23)
誤差関数とガンマ関数
(C99)
(C99)
(C99)
(C99)
マクロ定数
特殊な浮動小数点値
(C99)(C23)
引数と戻り値
エラーハンドリング
高速演算インジケータ
 
ヘッダー <math.h> で定義
float       scalbnf( float arg, int exp );
(1) (C99以降)
double      scalbn( double arg, int exp );
(2) (C99以降)
long double scalbnl( long double arg, int exp );
(3) (C99以降)
ヘッダー <tgmath.h> で定義
#define scalbn( arg, exp )
(4) (C99以降)
ヘッダー <math.h> で定義
float       scalblnf( float arg, long exp );
(5) (C99以降)
double      scalbln( double arg, long exp );
(6) (C99以降)
long double scalblnl( long double arg, long exp );
(7) (C99以降)
ヘッダー <tgmath.h> で定義
#define scalbln( arg, exp )
(8) (C99以降)
1-3,5-7) 浮動小数点数 argFLT_RADIXexp 乗を掛けます。
4,8) 型汎用マクロ: arg の型が long double の場合、scalbnl または scalblnl が呼び出されます。それ以外の場合、 arg の型が整数型または double の場合、scalbn または scalbln が呼び出されます。それ以外の場合、それぞれ scalbnf または scalblnf が呼び出されます。

目次

[edit] パラメータ

arg - floating-point value
exp - 整数値

[edit] 戻り値

エラーが発生しない場合、argFLT_RADIXexp 乗を計算した結果が返されます(arg×FLT_RADIXexp
)。

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

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

[edit] エラー処理

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

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

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

[edit] 注釈

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

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

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

[edit]

#include <errno.h>
#include <fenv.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
 
// #pragma STDC FENV_ACCESS ON
 
int main(void)
{
    printf("scalbn(7, -4) = %f\n", scalbn(7, -4));
    printf("scalbn(1, -1074) = %g (minimum positive subnormal double)\n",
            scalbn(1, -1074));
    printf("scalbn(nextafter(1,0), 1024) = %g (largest finite double)\n",
            scalbn(nextafter(1,0), 1024));
 
    // special values
    printf("scalbn(-0, 10) = %f\n", scalbn(-0.0, 10));
    printf("scalbn(-Inf, -1) = %f\n", scalbn(-INFINITY, -1));
 
    // error handling
    errno = 0; feclearexcept(FE_ALL_EXCEPT);
    printf("scalbn(1, 1024) = %f\n", scalbn(1, 1024));
    if (errno == ERANGE)
        perror("    errno == ERANGE");
    if (fetestexcept(FE_OVERFLOW))
        puts("    FE_OVERFLOW raised");
}

実行結果の例

scalbn(7, -4) = 0.437500
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.000000
scalbn(-Inf, -1) = -inf
scalbn(1, 1024) = inf
    errno == ERANGE: Numerical result out of range
    FE_OVERFLOW raised

[edit] 参考文献

  • C23標準 (ISO/IEC 9899:2024)
  • 7.12.6.13 The scalbn functions (p: TBD)
  • 7.25 Type-generic math <tgmath.h> (p: TBD)
  • F.10.3.13 The scalbn functions (p: TBD)
  • C17標準 (ISO/IEC 9899:2018)
  • 7.12.6.13 The scalbn functions (p: TBD)
  • 7.25 Type-generic math <tgmath.h> (p: TBD)
  • F.10.3.13 The scalbn functions (p: TBD)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.12.6.13 The scalbn functions (p: 247)
  • 7.25 型総称数学関数 <tgmath.h> (p: 373-375)
  • F.10.3.13 The scalbn functions (p: 523)
  • C99標準 (ISO/IEC 9899:1999)
  • 7.12.6.13 The scalbn functions (p: 228)
  • 7.22 型総称数学関数 <tgmath.h> (p: 335-337)
  • F.9.3.13 The scalbn functions (p: 460)

[edit] 関連項目

数を仮数部と2のべき乗に分割する
(関数) [編集]
数に2のべき乗を掛ける
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)