_scalb, _scalbl:计算 x 乘以 2 的整数 y 次幂:x*2y
函数原型:
double _scalb(double x, long y); |
long double _scalbl(long double x, long y); |
头文件:
#include <cfloat>
命名空间:
std
参数:
x:用二进位科学计数法表示的数据的有效数字,定义域范围为 [-Infinity, +Infinity],并不限于 (-1.0, -0.5] ∪ [0.5, 1.0)
y:指数,2 的 y 次幂 2y
返回值:
返回值:x 乘以 2 的 y 次幂:x * 2y,即 x * exp2(y),值域范围:[-Infinity, +Infinity]
NAN:定义域错误,此时全局变量 errno 的值为 EDOM。
计算可能会溢出,此时全局变量 errno 的值为 ERANGE。
例:12.34 = 0.77125 × 24
-8.2 × 10-20 = -0.756316507022092 × 2-63
这一组函数不是标准 C/C++ 函数,对应的标准 C/C++ 函数是 ldexp
例子:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double Xes[] = { 12.34, -987.65, 5.43e50, -8.2e-20 };
UnicodeString s;
for(size_t i=0; i<sizeof(Xes)/sizeof(Xes[0]); i++)
{
double x = Xes[i];
int y;
double w = std::frexp(x, &y);
Memo1->Lines->Add(s.sprintf(L"%g = %g * exp2(%d)", x, w, y));
Memo1->Lines->Add(s.sprintf(L"ldexp(%g, %d) = %g", w, y, std::ldexp(w,y)));
Memo1->Lines->Add(s.sprintf(L"_scalb(%g, %d) = %g", w, y, std::_scalb(w,y)));
Memo1->Lines->Add(L"");
}
} |
兼容性:
这一组函数不是标准 C/C++ 函数,对应的标准 C/C++ 函数是 ldexp
clang64 不支持这一组函数,可以使用标准 C/C++ 的函数 ldexp
相关链接:
• ldexp • frexp • exp2 • exp • pow • _matherr • 浮点数异常处理
|