换句话说,两个星号背后是什么?它只是将数字乘以x倍或其他?作为后续问题,写2**3或2*2*2是否更好.我问,因为我听说在C++中最好不要使用pow()进行简单的计算,因为它调用了一个函数.
我已经阅读了通过执行来cmath
计算.当它是整数时,不应该使用它,因为它会大大减慢计算速度.有什么替代方案pow(a,b)
exp(b*log(a))
b
pow()
sa
b
将肯定是一个整数?我正在寻找在这些特定情况下有效的快速替代方案.
我是C编程的新手,我编写了这段代码,因为我被要求主要使用printf()和scanf()来做一些事情.我知道可以有更好的方法来解决这个问题,我很快就需要学习,但无论如何,现在这就是我所拥有的:
int add1, add2, exponent, exponent_result, multiplier, parenthese, product, sub, total;
printf("Let's try a slightly more complex calculation, in which we'll use an exponent.\n\n");
printf("Type 5 whole numbers or integers.\n\n");
scanf("%i %i %i %i %i", &add1, &add2, &exponent, &multiplier, &sub);
printf("Out of the numbers you typed, we're going to make this operation: (%i + %i^%i) * %i - %i\n\n", add1, add2, exponent, multiplier, sub);
exponent_result = pow(add2, exponent);
parenthese = add1 + exponent_result;
product = parenthese * multiplier;
total = …
Run Code Online (Sandbox Code Playgroud) 我pow
在C中使用函数并将返回值存储为整数类型.请参阅下面的代码段:
for (i = 0; i < 5; i++){
val = (int)pow(5, i);
printf("%d, ", val);
}
Run Code Online (Sandbox Code Playgroud)
这里i
,val
是整数,输出是1, 5, 24, 124, 624
.我相信这是因为浮点数25被视为24.99999 ...在分配给整数时会向下舍入到24.
如果我仍然需要将返回值存储在int中,我怎么能通过这个?
我刚刚意识到使用Stream.reduce(...)实现以下算法来计算流的哈希码是不可能的.问题是哈希码的初始种子1
不是累加器的标识.
List.hashCode()的算法 :
int hashCode = 1;
for (E e : list)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
Run Code Online (Sandbox Code Playgroud)
您可能会想到以下内容是正确的,但事实并非如此,尽管如果流处理没有拆分它会起作用.
List<Object> list = Arrays.asList(1,null, new Object(),4,5,6);
int hashCode = list.stream().map(Objects::hashCode).reduce(1, (a, b) -> 31 * a + b);
Run Code Online (Sandbox Code Playgroud)
看来,这样做的唯一明智的方法是得到Iterator
的Stream
和做正常的顺序处理或将其收集到List
第一.
我需要一个AVX512 double pow(double, int n)
功能(我需要它进行二项分布计算,这需要精确).对于拥有AVX512ER的Knights Landing,我特别喜欢这个.获得这个的一种方法是
x^n = exp2(log2(x)*n)
Run Code Online (Sandbox Code Playgroud)
Knights Corner有vlog2ps
指令(_mm512_log2_ps
内在的)和vexp223ps
指令(_mm512_exp223_ps intrinsic
),所以至少我可以float pow(float, float)
用这两个指令来做.
然而,在Knights Landing中我找不到log2
指令.我确实在AVX512ER中找到了一条vexp2pd
指令(_mm512_exp2a23_pd
内在的).我觉得奇怪的是Knights Corner有一个log2
指令但Knights Landing更新更好没有.
现在我已经实现了pow(double, n)
使用重复的平方,但我认为如果我有一个log2
指令会更有效率.
//AVX2 but easy to convert to AVX512 with mask registers
static __m256d pown_AVX2(__m256d base, __m256i exp) {
__m256d result = _mm256_set1_pd(1.0);
int mask = _mm256_testz_si256(exp, exp);
__m256i onei = _mm256_set1_epi64x(1);
__m256d onef = _mm256_set1_pd(1.0);
while(!mask) { …
Run Code Online (Sandbox Code Playgroud) 我需要一个pow
整数版本.我有两个问题需要解决pow
:
numeric_limits::max()
C++是否在这里为我提供了某种内联解决方案,或者我是不是在编写自己的函数:
template <typename T>
enable_if_t<is_integral_v<T>, T> mypow(const T base, unsigned int exp) {
T result = exp == 0U ? base : 1;
while(exp-- > 1U) {
if(numeric_limits<T>::max() / result <= base) return numeric_limits<T>::max();
result *= base;
}
return result;
}
Run Code Online (Sandbox Code Playgroud) 我需要创建一个优化函数来计算Math.pow(a,b)%c; 在Javascript中;
计算小数字时没有问题:
Math.pow(2345,123) % 1234567;
但是如果你试图计算:
Math.pow(2345678910, 123456789) % 1234567;
由于Math.pow()函数结果不能计算"大"数字,你会得到不正确的结果;
我的解决方案是:
function powMod(base, pow, mod){
var i, result = 1;
for ( i = 0; i < pow; i++){
result *= base;
result %= mod;
}
return result;
Run Code Online (Sandbox Code Playgroud)
虽然需要大量的时间来计算;
有可能以某种方式优化它或找到更合理的方式来计算Math.pow(a,b)%c; 对于"大"数字?(我写的是"大",因为他们不是真正的大事);
琐碎的问题:我只是想知道,如果一个人想要提高一个int或一个long来强制另一个int或long,
(long)std::pow((double)a,(double)b)
Run Code Online (Sandbox Code Playgroud)
足够,或者我需要
(long)(0.5 + std::pow((double)a,(double)b))
Run Code Online (Sandbox Code Playgroud)
?
所以我想做pow(x,y).其中x和y是无符号长整数,结果存储在无符号长整数中.这个结果将小于2 ^ 63所以我应该能够做到这一点.但由于它返回一个浮点数,我得到大数字的不准确结果.无论如何都可以在不使用像bignum这样的外部库的情况下获得精确的结果?我知道我可以简单地做x*xa Y次,但这是我想避免的,因为我试图让我的程序更快.