众所周知,标量数组的缺少初始值设定值默认为零.
int A[5]; // Entries remain uninitialized
int B[5]= { 0 }; // All entries set to zero
Run Code Online (Sandbox Code Playgroud)
但是这(下面)保证了吗?
int C[5]= { }; // All entries set to zero
Run Code Online (Sandbox Code Playgroud) 我想定义一个有效的整数下限函数,即从float或double转换为向负无穷大执行截断。
我们可以假设这些值使得没有整数溢出发生。到目前为止,我有一些选择
转换为int 这需要对负值进行特殊处理,因为转换会截断为零。
I= int(F); if (I < 0 && I != F) I--;
Run Code Online (Sandbox Code Playgroud)将floor的结果转换为int;
int(floor(F));
Run Code Online (Sandbox Code Playgroud)强制转换为int以获得较大的正数(对于较大的值,这可能会返回错误的结果);
int(F + double(0x7fffffff)) - 0x7fffffff;
Run Code Online (Sandbox Code Playgroud)众所周知,将数据类型转换为int很慢。如果测试也是如此。我尚未设置发言权功能的时间,但是看到帖子声称它也很慢。
您能在速度,准确性或允许范围方面考虑更好的替代方法吗?它不需要是便携式的。目标是最新的x86 / x64体系结构。
我正在将使用SSE2内在函数编写的矢量化代码迁移到AVX2内在函数.
令我失望的是,我发现移位指令_mm256_slli_si256和_mm256_srli_si256仅分别在AVX寄存器的两半上运行,并且在它们之间引入了零.(这与处理整个SSE寄存器的_mm_slli_si128和_mm_srli_si128相反.)
你能推荐我一个简短的替代品吗?
更新:
_mm256_slli_si256 有效地实现了
_mm256_alignr_epi8(A, _mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 3, 0)), N)
要么
_mm256_slli_si256(_mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 3, 0)), N)
对于大于16字节的移位.
但问题仍然存在_mm256_srli_si256.
我想使用一个#include带有文件名的指令,该指令作为外部定义的宏传递.
例如
#include #FILE".h"
Run Code Online (Sandbox Code Playgroud)
where FILE将被定义为字符串MyFile(不带引号),从而导致
#include "MyFile.h"
Run Code Online (Sandbox Code Playgroud)
此处不能使用字符串化运算符#,因为符号FILE不是宏参数.我尝试过其他方法,但无济于事.
你看到了解决方案吗?
我N在飞机上有一小组点,N < 50.
我想枚举集合中所有三点的点,形成一个不包含其他点的三角形.
即使明显的蛮力解决方案对我的微小也是可行的N,但它具有复杂性O(N^4).
您是否知道一种降低时间复杂度的方法,比方说O(N³)或O(N²)保持代码简单?没有图书馆允许.
令我惊讶的是,这种三角形的数量相当大.将任意点作为中心,并通过增加其周围的角度来对其他点进行排序.这形成一个星形多边形,给出N-1空三角形,因此总共为?(N²).已经证明这个界限很紧[平面点集与少量空凸多边形,I.Bárány和P. Valtr].
在形成凸多边形的点的情况下,所有三角形都是空的O(N³).快速算法的机会越来越低:(
通过从0和1开始然后添加最后两个数字以获得下一个数来获得斐波那契序列.
所有正整数都可以表示为一组Fibonacci数的总和而不重复.例如:13可以是集合{13},{5,8}或{2,3,8}的总和.但是,正如我们所看到的,一些数字有多个集合,其总和是数字.如果我们添加约束集不能有两个连续的Fibonacci数,那么我们每个数都有一个唯一的表示.
我们将使用二进制序列(只有零和1)来做到这一点.例如,17 = 1 + 3 + 13.然后,17 = 100101.详细说明见图2.
我想将一些整数转换为这种表示,但整数可能非常大.如何有效地做到这一点.
C++允许您将两个整数比较组合在一起进行范围检查,例如
(unsigned)X < (unsigned)Upper
Run Code Online (Sandbox Code Playgroud)
当返回时返回true
0 <= X < Upper
Run Code Online (Sandbox Code Playgroud)
Java语言没有无符号类型.您是否看到了一种获得相同效果的方法,使用单一比较而不是太多开销?
更新:
从@Bathsheba的评论来看,char类型是无符号的16位并且适合我的目的,因为我的整数实际上在短裤的范围内.
问题仍然存在问题int.
可能是某些东西(X | (Upper - 1 - X)) >= 0,允许30位的范围.
我有一组轴对齐的矩形.当两个矩形重叠(部分或完全)时,它们将合并到它们的公共边界框中.此过程以递归方式工作.
检测所有的重叠和使用工会发现,形成组,您合并,最终将无法工作,因为两个矩形的合并覆盖更大面积,可以创造新的重叠.(在下图中,合并了两个重叠的矩形后,会出现新的重叠.)
在我的情况下,矩形的数量是中等的(比如N <100),可以使用强力解决方案(尝试所有对,如果发现重叠,则从头开始合并并重新启动).无论如何,我想降低复杂性,在最坏的情况下可能是O(N³).
有什么建议如何改善这个?
我试图在VS 2008下用C ++编写的.NET应用程序中使字符串持久化(即,它是文件路径)。我只需要在应用程序启动时阅读它,并在离开时编写它即可。
我正在努力寻找适当的方法来做到这一点。Web搜索将我定向到ConfigurationSettings和ConfigurationManager对象。似乎第一个是只读的,而第二个在配置参考(框架3.5)中找不到。
我知道我可以对注册表或外部文件执行显式的读/写操作,但我希望使用更标准的方法。我不希望这需要两行以上的代码。
我在正确的轨道上吗?
我正在使用Windows GDI函数Arc绘制圆弧.它需要参数圆的边界框和两个分界开始和结束角度的点(不是角度本身).
当我传递如下的参数时,我得到一个异常结果.而不是具有大半径的圆的准平圆弧(大约13069,边界框是正方形),我得到图片上的输出(旋转;第二个版本显示两个端点的位置;第三个是预期的输出).
Arc(hDC, -25660, -12837, 477, 13300, 475, 462, 476, 66);
Run Code Online (Sandbox Code Playgroud)
我怀疑异常是由于弧的大半径/平坦度,尽管坐标不是那么大.你有什么解释吗?我主要关注的是找到出现这些显着特征的条件,以便解决这些问题.
这是一个产生问题的简单控制台应用程序:
#include <Windows.h>
int main(int argc, char* argv[])
{
HDC hDC= GetDC(GetForegroundWindow());
SelectObject(hDC, GetStockObject(WHITE_PEN));
// Right
Arc(hDC, -16, 37, 457, 510, 475, 462, 476, 66);
// Wrong
Arc(hDC, -25660, -12837, 477, 13300, 475, 462, 476, 66);
return 0;
}
Run Code Online (Sandbox Code Playgroud) algorithm ×3
c++ ×3
.net ×1
arrays ×1
avx2 ×1
comparison ×1
floor ×1
gdi ×1
include ×1
intrinsics ×1
java ×1
math ×1
performance ×1
persistence ×1
precision ×1
rectangles ×1
simd ×1
sse2 ×1
windows ×1
x86-64 ×1