bar*_*nos 1 c c++ double bit-shift
以下函数移位 - 左double操作数:
double shl(double x,unsigned long long n)
{
unsigned long long* p = (unsigned long long*)&x;
*p += n << 52;
return x;
}
Run Code Online (Sandbox Code Playgroud)
这个功能是否保证在所有平台上都能正常工作?
你可以假设的有效组合x和n(即,x*2^n不溢).
换句话说,我问的是语言标准是否规定了以下内容:
类型的指数位double是52,53,54,55,56,57,58,59,60,61,62
位大小double等于位大小unsigned long long等于64
严格走样规则double和unsigned long long不破
如果C和C++的答案不同,那么我想知道它们中的每一个.
不,C和C++都没有规定语言标准中浮点类型的表示,尽管建议使用IEEE格式,并且__STDC_IEC_559__应该使用macro()来检测它是否在使用中.
除了不同的表示外,您的解决方案还存在多个问题.您已经发现严格的别名违规...优化器可能会将您的整个函数转换为无操作,因为double在函数的开头和返回值之间没有修改,它可以假设x不会更改.你还可能有溢出问题 - 你需要某种形式的饱和算法,不允许结果进入符号位.
但是,您不需要乱用任何内容,因为标准库已经包含您尝试编写的函数.
它被命名ldexp(和ldexpf为float).