名前空間
変種
操作

scalbn, scalbnf, scalbnl, scalbln, scalblnf, scalblnl

提供: cppreference.com
< c‎ | numeric‎ | math
 
 
 
一般的な数学関数
関数
基本操作
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)(C99)(C99)
指数関数
(C99)
(C99)
(C99)
(C99)
冪関数
(C99)
(C99)
三角関数と双曲線関数
(C99)
(C99)
(C99)
誤差関数とガンマ関数
(C99)
(C99)
(C99)
(C99)
最も近い整数
(C99)(C99)(C99)
(C99)
(C99)(C99)(C99)
浮動小数点操作関数
scalbnscalbln
(C99)(C99)
(C99)
(C99)
分類
(C99)
(C99)
(C99)
(C99)(C99)
マクロ定数
 
ヘッダ <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) 型総称マクロ。 arglong double 型の場合はそれぞれ scalbnl または scalblnl が呼ばれます。 そうでなく、 arg が整数型または double 型の場合は scalbn または scalbln が呼ばれます。 そうでなければ scalbnf または scalblnf が呼ばれます。

目次

[編集] 引数

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

[編集] 戻り値

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

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

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

[編集] エラー処理

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

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

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

[編集] ノート

2進数 (FLT_RADIX2) のシステムでは、 scalbnldexp と同等です。

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

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

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

[編集]

#include <stdio.h>
#include <math.h>
#include <float.h>
#include <errno.h>
#include <fenv.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

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.12.6.13 The scalbn functions (p: 247)
  • 7.25 Type-generic math <tgmath.h> (p: 373-375)
  • F.10.3.13 The scalbn functions (p: 523)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.12.6.13 The scalbn functions (p: 228)
  • 7.22 Type-generic math <tgmath.h> (p: 335-337)
  • F.9.3.13 The scalbn functions (p: 460)

[編集] 関連項目

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