函式
<cmath> <ctgmath>

scalbn

     double scalbn  (double x     , int n);      float scalbnf (float x      , int n);long double scalbnl (long double x, int n);
     double scalbn (double x     , int n);      float scalbn (float x      , int n);long double scalbn (long double x, int n);     double scalbn (T x          , int n); // additional overloads for integral types
使用浮點基數的底數縮放尾數
x 乘以 FLT_RADIXn 次冪,返回的結果與

scalbn(x,n) = x * FLT_RADIXn 相同

假定 xn 是系統中浮點數的組成部分;在這種情況下,此函式可以被最佳化,使其比顯式計算值的理論運算更有效。

在大多數平臺上,FLT_RADIX2,這使得該函式等同於 ldexp

標頭檔案 <tgmath.h> 提供了此函式的型別通用宏版本。
在此標頭檔案中(<cmath>)為 整數型別提供了其他過載:這些過載在計算前有效地將 x 轉換為 double(為 T 是任何整數型別 定義)。

還有該函式的另一個版本:scalbln,它完全相同,但第二個引數是 long int

引數

x
表示尾數的值。
exp
指數的值。

返回值

返回 x * FLT_RADIXn
如果結果的絕對值對於返回型別來說過大而無法表示,則函式返回帶有正確符號的 HUGE_VAL(或 HUGE_VALFHUGE_VALL),並且可能發生溢位範圍錯誤(如果過小,函式返回零,並且可能發生下溢範圍錯誤)。

如果發生範圍錯誤
- 並且 math_errhandling 設定了 MATH_ERRNO:全域性變數 errno 被設定為 ERANGE
- 並且 math_errhandling 設定了 MATH_ERREXCEPT:將引發 FE_OVERFLOWFE_UNDERFLOW

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* scalbn example */
#include <stdio.h>      /* printf */
#include <float.h>      /* FLT_RADIX */
#include <math.h>       /* scalbn */

int main ()
{
  double param, result;
  int n;

  param = 1.50;
  n = 4;
  result = scalbn (param , n);
  printf ("%f * %d^%d = %f\n", param, FLT_RADIX, n, result);
  return 0;
}

輸出

1.500000 * 2^4 = 24.000000


另見