C++官网参考链接:https://cplusplus.com/reference/cmath/scalbn/
函数
<cmath> <ctgmath>
scalbn
C99
double scalbn(double x, int n);
float scalbnf(float x, int n);
long double scalbnl(long double x, int n);
C++11
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_RADIX的n次幂,返回相同的结果:
scalbn(x,n) = x * FLT_RADIX^n
假设x和n是系统中浮点数的组成部分;在这种情况下,这个函数可以优化到比显式计算值的理论操作更有效。
在大多数平台上,FLT_RADIX为2,使此函数等价于ldexp。
C99
头文件<tgmath.h>提供了该函数的泛型类型的宏版本。
C++11
在此头文件(<cmath>)中为整型(integral types)提供了额外的重载:这些重载在计算之前有效地将x转换为double类型(定义T为任何整型(integral types))。
这个函数还有另一个版本:scalbln,它与此相同,只是它的第二个实参是一个long int类型。
形参
x
表示有效值。
exp
指数的值。
返回值
返回x * FLT_RADIX^n。
如果结果的绝对大小太大,无法用返回类型的值表示,则函数返回带有适当符号的HUGE_VAL(或HUGE_VALF或HUGE_VALL),并可能发生上溢范围错误(如果太小,则函数返回0,并可能发生下溢范围错误)。
如果出现范围错误:
—math_errhandling具有MATH_ERRNO集合:全局变量errno设置为ERANGE。
—math_errhandling具有MATH_ERREXCEPT集合:引发FE_OVERFLOW或FE_UNDERFLOW。
用例
/* 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;
}
输出: