下面的函数左移一个double
操作数:
double shl(double x,unsigned long long n)
{
unsigned long long* p = (unsigned long long*)&x;
*p += n << 52;
return x;
}
这个函数是否保证在所有平台上都能正常工作?
您可以假设 x
和 n
的有效组合(即 x*2^n
不会溢出)。
换句话说,我问的是语言标准是否规定了以下内容:
double
类型的指数位是 52,53,54,55,56,57,58,59,60,61,62double
的位大小等于unsigned long long
的位大小等于 64double
和unsigned long long
的严格别名规则没有被破坏
如果 C 和 C++ 的答案不同,那么我想知道每一个。
最佳答案
不,C 和 C++ 都没有规定语言标准中浮点类型的表示,尽管推荐使用 IEEE 格式并且应该有一个宏 (__STDC_IEC_559__
) 来检测它是否可用正在使用中。
除了不同的表示之外,您的解决方案还有多个问题。您已经发现了严格的别名违规......优化器可能会将您的整个函数变成空操作,因为在函数的开头和返回值之间没有修改 double
,它可以假设 x
没有改变。您还可能遇到溢出问题——您需要某种形式的饱和算法,不允许将结果带入符号位。
但是,您不需要搞乱这些,因为标准库已经包含您要编写的函数。
它被命名为 ldexp
(ldexpf
代表 float
)。
关于c++ - 左移一个 'double' 操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25714921/