我想反转长双的指数。反转长双的指数给我一个疯狂的结果
假设x = 3.5e1356。我想x是3.5e-1356。
我有这样的代码:
long double x = 3.5e1356L;
int exponent;
long double fraction = frexpl(x, &exponent);
// recreate number with an inverted exponent
long double newNumber = ldexpl(fraction, -exponent);
此代码后newNumber
是1.14732677619641872902e-1357
有无关原来的号码。
我错过了什么?
指数是二进制,而不是小数。 – user2357112
尝试查看LDBL_MAX和LDBL_MIN的(实现定义的)值(long double可分别表示最大和最小正值)。即使“LDBL_MAX”的“典型”值不超过“1E308”,并且您的输入值比这大得多 - 因此可能会溢出。一旦发生这种情况,行为是不确定的。基本的事情要记住:浮点表示不能表示任何数量级的任意值。 – Peter
@peter:在英特尔硬件上,long double具有16位指数,这允许比1E308大得多的数字。 – rici