相关疑难解决方法(0)

什么是严格别名规则?

当询问C中常见的未定义行为时,灵魂比我提到的严格别名规则更加开明.
他们在说什么?

c strict-aliasing undefined-behavior type-punning

778
推荐指数
10
解决办法
19万
查看次数

JavaScript中的"双波浪"(~~)运算符是什么?

我在一些代码中看到了这一点,我不知道它的作用:

var jdn = function(y, m, d) {
  var tmp = (m <= 2 ? -1 : 0);
  return ~~((1461 * (y + 4800 + tmp)) / 4) + 
         ~~((367 * (m - 2 - 12 * tmp)) / 12) - 
         ~~((3 * ((y + 4900 + tmp) / 100)) / 4) + 
         d - 2483620;
};
Run Code Online (Sandbox Code Playgroud)

什么是~~运营商吗?

javascript

518
推荐指数
4
解决办法
12万
查看次数

是否可以使用整数运算实现按位运算符?

我面临一个相当特殊的问题.我正在研究一种不支持按位运算的体系结构的编译器.但是,它处理签名的16位整数算术,我想知道是否有可能只使用以下方式实现按位运算:

  • 加法(c = a + b)
  • 减法(c = a - b)
  • 分部(c = a/b)
  • 乘法(c = a*b)
  • 模数(c = a%b)
  • 最小值(c = min(a,b))
  • 最大值(c = max(a,b))
  • 比较(c =(a <b),c =(a == b),c =(a <= b),et.c.)
  • 跳转(goto,for,et.c.)

我希望能够支持的按位操作是:

  • 或者(c = a | b)
  • 并且(c = a&b) …

discrete-mathematics bitwise-operators compiler-optimization

53
推荐指数
3
解决办法
2万
查看次数

检测在C++中存储为double的负0

我正在做一些数学计算(尝试使用VS2010将Matlab代码转换为C++),我需要能够判断在某些时候我得到负0.

根据IEEE标准-0/+ 0仅在符号位上有所不同(其余为0).

我使用下面的代码(post)将我的double解释为unsigned char

double f = -5;
    unsigned char *c = reinterpret_cast<unsigned char *>(&f);
    for(int i=(sizeof(double)-1); i>=0; i--){
        printf("%02X", c[i]);
   }
Run Code Online (Sandbox Code Playgroud)

尝试用5/-5我得到预期的结果:

C014000000000000 (-5)
4014000000000000 (5)
Run Code Online (Sandbox Code Playgroud)

但是当我用0/-0尝试它时,我在这两种情况下都只得到零.VS2010声称它们符合IEEE标准(msdn),所以我不确定它的哪一部分我没有得到.

如果0/-0确实以完全相同的方式存储在内存中,我无法分辨它是否需要,所以我应该停止浪费时间:)对吗?

c++ double ieee-754

19
推荐指数
2
解决办法
4550
查看次数

为什么标准的“abs”功能比我的快?

我想尝试制作自己的绝对值函数。我认为计算绝对值的最快方法是简单地屏蔽符号位(IEEE 754 中的最后一位)。我想将它的速度与标准abs功能进行比较。这是我的实现:

// Union used for type punning
union float_uint_u
{
    float f_val;
    unsigned int ui_val;
};

// 'MASK' has all bits == 1 except the last one
constexpr unsigned int MASK = ~(1 << (sizeof(int) * 8 - 1));

float abs_bitwise(float value)
{
    float_uint_u ret;
    ret.f_val = value;
    ret.ui_val &= MASK;
       
    return ret.f_val;
}
Run Code Online (Sandbox Code Playgroud)

作为记录,我知道这种类型的双关语不是标准的 C++。但是,这仅用于教育目的,根据文档,这在 GCC 中得到支持

我认为这应该是计算绝对值的最快方法,因此它至少应该与标准实现一样快。但是,对随机值的 100000000 次迭代计时,我得到了以下结果:

Bitwise time: 5.47385 | STL time: 5.15662
Ratio: 1.06152
Run Code Online (Sandbox Code Playgroud)

我的abs函数慢了大约 6%。 …

c++ gcc g++ compiler-optimization

13
推荐指数
1
解决办法
573
查看次数

左移浮动类型

尝试时遇到编译器错误

float_val=float_val<<1;
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误,说"错误C2296:'<<':非法,左操作数的类型为'float'"

不能左移左浮球?为什么会这样?

c floating-point floating-point-conversion

6
推荐指数
2
解决办法
1万
查看次数

MSVC 不良装配生成

比较 MSVC、clang 和 GCC 中生成的程序集时。MSVC 程序集似乎比 Clang 代码差得多。


问题

GCC 和 MSVC 中是否有一个必需的标志来生成等效的程序集,或者在这种特定情况下 Clang 更好。我尝试了各种 MSVC 标志(不同的 /O 标志),但没有发生实质性变化。

或者我的代码是否有变化,可以让编译器实现更好的优化。我尝试过改变代码而不丢失基本结构也没有改变。


代码

我正在编译的代码只有 26 行,所以这里是:

#include <cstdint>
#include <type_traits>

template <typename A, typename B>
struct BitCast
{
    static_assert(std::is_pod<A>(), "BitCast<A, B> : A must be plain old data type.");
    static_assert(std::is_pod<B>(), "BitCast<A, B> : B must be plain old data type.");
    static_assert(sizeof(A) == sizeof(B), "BitCast<A, B> : A and B must be the same size.");
    static_assert(alignof(A) == alignof(B), "BitCast<A, B> : A and …
Run Code Online (Sandbox Code Playgroud)

c++ assembly gcc clang visual-c++

5
推荐指数
0
解决办法
313
查看次数

快速登录C++ float ...这段代码中是否有任何平台依赖?

在线搜索,我发现以下例程用于计算IEEE格式的浮点符号.这也很容易扩展到双倍.

// returns 1.0f for positive floats, -1.0f for negative floats, 0.0f for zero
inline float fast_sign(float f) {
    if (((int&)f & 0x7FFFFFFF)==0) return 0.f; // test exponent & mantissa bits: is input zero?
    else {
        float r = 1.0f;
        (int&)r |= ((int&)f & 0x80000000); // mask sign bit in f, set it in r if necessary
        return r;
    }
}
Run Code Online (Sandbox Code Playgroud)

(来源:``32位漂浮物的快速标志'',Peter Schoffhauzer)

但是,由于二进制位操作,我厌倦了使用这个例程.我需要我的代码在具有不同字节顺序的机器上工作,但我不确定IEEE标准中有多少指定,因为我找不到今年发布的最新版本.有人能告诉我这是否有效,无论机器的字节顺序如何?

谢谢,帕特里克

c++ floating-point endianness ieee-754

4
推荐指数
1
解决办法
8811
查看次数

在Matlab中进行类型转换

我理解了如何在Matlab的帮助文件中解释类型转换.但无法应付我的结果.我尝试按照以下方式对3x4矩阵进行类型转换.

A= -0.0022  -87.8788  -96.2848  -96.9586
    0.9891  -52.9250  -52.7722  -52.7780
    0.1473   -4.8680   -6.0184   -5.9894

ANS = typecast(A(:), 'uint16');
Run Code Online (Sandbox Code Playgroud)

然后ANS矢量变为

ANS=65304
    47886
    13518
    16253
    55853
    15894
    49650
    49839
    45875
    49747
    50835
    49307
    37329
    49856
     5820
    49747
    38546
    49344
    60110
    49857
     7340
    49747
    43369
    49343
Run Code Online (Sandbox Code Playgroud)

这意味着-0.0022有两个16位值65304和47886.它是如何计算的?那么我该如何在C++中实现呢?在C++中,我实现了类似的

float f = -0.0022;
unsigned short a = static_cast<unsigned int>(f);
unsigned short b = static_cast<unsigned int>(f)>>16;
Run Code Online (Sandbox Code Playgroud)

我不能把a和b作为65304和47886.

c++ matlab

3
推荐指数
1
解决办法
435
查看次数

|之间的区别 和|| ,或者&和&&

这些是在Dev-cpp C++ 5.4.2上编写的两个简单的C++示例:

float a, b, c;

if (a | b  & a | c)
   printf("x = %.2f\tF = %.0f\n", x, F);
else
   printf("x = %.2f\tF = %.2f\n", x, F);
Run Code Online (Sandbox Code Playgroud)

而这段代码:

float a, b, c;

if (a || b  && a || c)
   printf("x = %.2f\tF = %.0f\n", x, F);
else
   printf("x = %.2f\tF = %.2f\n", x, F);
Run Code Online (Sandbox Code Playgroud)

有谁能告诉我之间的差异||> |&> &&.第二个代码有效,但首先没有.编译器给出了一条错误消息:

[错误]类型'float'和'float'到二进制'运算符&'的操作数无效.

c++ bitwise-operators

3
推荐指数
2
解决办法
2万
查看次数