函数
<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


另见