gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:18:44 31 4
gpt4 key购买 nike

下面的函数左移一个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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com