c++ - 左移一个 'double' 操作数

标签 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;
}

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

您可以假设 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++ 的答案不同,那么我想知道每一个。

最佳答案

不,C 和 C++ 都没有规定语言标准中浮点类型的表示,尽管推荐使用 IEEE 格式并且应该有一个宏 (__STDC_IEC_559__) 来检测它是否可用正在使用中。

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

但是,您不需要搞乱这些,因为标准库已经包含您要编写的函数。

它被命名为 ldexp(ldexpf 代表 float)。

关于c++ - 左移一个 'double' 操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25714921/

相关文章:

C++/WinAPI GDI+ 双缓冲

java - 使用 double 的正确符号

c++ - 有没有办法在遇到 `\n` 时停止 std::cin

c++ - 无法弄清楚我的合并排序 C++ 有什么问题

c - DESTDIR 和 PREFIX 的 make

c - 将整个数组作为参数传递给函数

c# - Convert.ToDouble 中忽略小数点

c++ - 不一致的二进制数据或条件语句更改数据

c++ - 如何使用c++在sqlite中插入wchar?

c - Stdin + 字典文本替换工具 -- 调试