Shift-左移'双'操作数

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)

这个功能是否保证在所有平台上都能正常工作?

你可以假设的有效组合xn(即,x*2^n不溢).


换句话说,我问的是语言标准是否规定了以下内容:

  1. 类型的指数位double是52,53,54,55,56,57,58,59,60,61,62

  2. 位大小double等于位大小unsigned long long等于64

  3. 严格走样规则doubleunsigned long long不破

如果C和C++的答案不同,那么我想知道它们中的每一个.

Ben*_*igt 8

不,C和C++都没有规定语言标准中浮点类型的表示,尽管建议使用IEEE格式,并且__STDC_IEC_559__应该使用macro()来检测它是否在使用中.

除了不同的表示外,您的解决方案还存在多个问题.您已经发现严格的别名违规...优化器可能会将您的整个函数转换为无操作,因为double在函数的开头和返回值之间没有修改,它可以假设x不会更改.你还可能有溢出问题 - 你需要某种形式的饱和算法,不允许结果进入符号位.

但是,您不需要乱用任何内容,因为标准库已经包含您尝试编写的函数.

它被命名ldexp(和ldexpffloat).