在这里击败死马.在C中执行整数幂的典型(和快速)方法是经典的:
int64_t ipow(int64_t base, int exp){
int64_t result = 1;
while(exp){
if(exp & 1)
result *= base;
exp >>= 1;
base *= base;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
但是我需要一个编译时整数幂,所以我继续使用constexpr进行递归实现:
constexpr int64_t ipow_(int base, int exp){
return exp > 1 ? ipow_(base, (exp>>1) + (exp&1)) * ipow_(base, exp>>1) : base;
}
constexpr int64_t ipow(int base, int exp){
return exp < 1 ? 1 : ipow_(base, exp);
}
Run Code Online (Sandbox Code Playgroud)
第二个函数只是以可预测的方式处理小于1的指数.exp<0在这种情况下,传递是一个错误.
我在[0,15]范围内生成10E6随机值基数和指数的向量,并在向量上计算两个算法的时间(在进行非定时运行以尝试去除任何缓存效果之后).没有优化,recursice方法的速度是循环的两倍.但是使用-O3(GCC)时,循环比recursice方法快4倍.
我向你们提出的问题是:任何人都可以提出一个更快的ipow()函数来处理指数和0的基数并且可以用作constexpr?
(免责声明:我不需要更快的ipow,我只是想看看这里的聪明人能想出什么).
我需要生成LLVM代码,它将服务于许多线程/任务(数十万).这些线程应该像英特尔TBB的任务,golang gorutines或其他一样轻量级.当然,它们可以使用外部C++库实现,如提到的Intel TBB(如果它与LLVM兼容).
我在很长一段时间内搜索有关LLVM中线程的任何信息,但我找不到多少.在LLVM的文档中描述了一些API调用,但我认为它不是我正在寻找的.
所以问题很少:
如何有效地枚举有限集上的所有偏序?
我想检查是否存在具有指定属性的部分订单.为了检查这一点,我将用蛮力来枚举小有限集上的所有可能的偏序.
让我们玩下面的代码:
#include <iostream>
template <class T>
void func(T&&) {
std::cout<<"in rvalue\n";
}
template <class T>
void func(const T&) {
std::cout<<"in lvalue\n";
}
int main()
{
double n=3;
func<double>(n);
func(n);
}
Run Code Online (Sandbox Code Playgroud)
它打印:
in lvalue
in rvalue
Run Code Online (Sandbox Code Playgroud)
我不明白第二次电话会发生什么.编译器如何解析模板参数?为什么没有歧义?
我想在python上计算二项式概率.我试着应用这个公式:
probability = scipy.misc.comb(n,k)*(p**k)*((1-p)**(n-k))
Run Code Online (Sandbox Code Playgroud)
我得到的一些概率是无限的.我检查了一些p = inf的值.对于其中一个,n = 450,000,k = 17.该值必须大于1e302,这是浮点数处理的最大值.
然后我试着用 sum(np.random.binomial(n,p,numberOfTrials)==valueOfInterest)/numberOfTrials
这将绘制numberOfTrials样本并计算绘制valueOfInterest值的平均次数.
这不会带来任何无限的价值.但是,这是一种有效的方法吗?为什么这种方式不会产生任何无限的价值而计算概率呢?
我在准备考试时遇到了以下问题:
想象一下单词的字母.例:
a ==> 1
b ==> 2
c ==> 3
...
z ==> 26
ab ==> 27
ac ==> 28
...
az ==> 51
bc ==> 52
and so on.
Run Code Online (Sandbox Code Playgroud)
字符序列只需要按升序排列(即'ab'有效但'ba'不是).
问题:给定任何单词,如果有效则打印其索引,否则打印0.
Input Output
ab 27
ba 0
aez 441
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题的任何指针将不胜感激.
为什么constexpr变量的decltype失败?
#include <cstdint>
#include <type_traits>
constexpr uint16_t foo(){ return 0;}
constexpr auto cv = foo();
auto v = foo();
static_assert( std::is_same< uint16_t, decltype(cv)>::value, "!"); // failed
static_assert( std::is_same< uint16_t, decltype(v) >::value, "!"); // success
Run Code Online (Sandbox Code Playgroud) 我有2套,集合A包含一组随机数,而集合B的元素是集合A的子集的总和.
例如,
A = [8, 9, 15, 15, 33, 36, 39, 45, 46, 60, 68, 73, 80, 92, 96]
B = [183, 36, 231, 128, 137]
Run Code Online (Sandbox Code Playgroud)
我想找到哪个数字是哪个子集的总和与这样的数据.
S = [[45, 46, 92], [36], [8, 15, 39, 73, 96], [60, 68], [9, 15, 33, 80]]
Run Code Online (Sandbox Code Playgroud)
我能用python编写非常愚蠢的暴力代码.
class SolvedException(BaseException):
pass
def solve(sums, nums, answer):
num = nums[-1]
for i in range(0, len(sums)):
sumi = sums[i]
if sumi == 0:
continue
elif sumi - num < 0:
continue
answer[i].append(num)
sums[i] = sumi - …Run Code Online (Sandbox Code Playgroud) 我正在尝试理解一些递归的C++模板代码,我已经交了,而且我遇到了一些奇怪的行为.出于某种原因,编译器似乎能够在编译时添加两个值,但是必须保留左移以用于运行时.即使这样,只有在我尝试使用c ++ 11构建时才会出现问题.
代码(我已经煮浓,以后你会看到)定义2对模板-一个指定的对shft和shft_aux与一个指定的对add和add_aux产生自身递归.顺便说一句,add模板不应该有用,它的唯一目的是证明问题,而不是生成实际min值.
如果我编译此代码没有命令行参数,它编译就好了.但是,如果我指定-std=c++11 -stdlib=libc++,add_aux上的static_assert仍然可以,但shft_aux上的static_assert现在会生成编译时错误static_assert expression is not an integral constant expression.
为什么左移处理不同于添加?
谢谢,克里斯
ps我正在使用clang ++版本 Apple LLVM version 5.1 (clang-503.0.38) (based on LLVM 3.4svn)
#include <climits>
template <unsigned size> struct shft; // forward
template <unsigned size>
struct shft_aux
{
static const int min = shft<size>::min;
};
template <unsigned size>
struct shft
{
typedef shft_aux<size - 1> prev;
static const int min = …Run Code Online (Sandbox Code Playgroud)