你如何使用迭代计算 C 中的负幂?
How do you calculate negative powers in C using iteration?
我正在用 C 语言编写一个函数,它接受一个 float base 和 int power,并计算 base^power
到目前为止我有:
float powIteration(float base, int power){
if (power == 0){
return 1;
}
else if (power > 0){
for (int i = 0; i <= power; i++){
base *= base;
}
return base;
}
else if (power < 0){
for (int i = 0; i <= power; i++){
base *= base;
}
return 1/base;
}
}
我已经用递归解决了这个问题。但我也想用迭代来做。但出于某种原因,这段代码会产生类似 2^-2 = 0.5
的结果
此外,这种方法甚至可以实现所谓的 "iterative approach" 吗?
由于我发现的第一个错误立即回答了最后一个,所以我想我会去测试并帮助你解决这个问题。
首先,您要在每次迭代中更改 base
,而您不希望这样,否则您不会每次都乘以一个值,而是每次迭代都不同。就像pm100说的:你要记住你原来的基地。示例:使用 base=2
和 power=-3
:
i=0 -> base *= base; 2*2 = 4;
i=1 -> now base is 4 so: 4*4 = 16;
i=2 -> now base is 8 so: 8*8 = 64; and you want it to be 2*2*2
最后1/value
会给你正确答案
同样在你的负循环中:你让你的循环从 0
开始,如果你的力量是 -2
,那么它不符合你的 运行 ] 条件 i <= power
因为你的 i
总是 > power
;
应该是这样的:
for (int i = power+1; i<0; i++)
我为你做了一些修改:
float powIteration(float base, int power){
float num=base;
if (power == 0){
return 1;
}else if (power > 0){
for (int i = 1; i < power; i++){
num=num*base;
}
return num;
}else if (power < 0){
for (int i = power+1; i<0; i++){
num=num*base;
}
return 1/num;
}
}
小心这种构造
if (...) { }
else if (...) { }
else if (...) { }
// ^^^^^^^^ Why the 'if'? It should just be an 'else'
您的编译器甚至可以警告您:
warning: non-void function does not return a value in all control paths [-Wreturn-type]
循环在几个方面是错误的
else if (power > 0) {
for (int i = 0; i <= power; i++) {
// ^^ That's an off by one error. Likely.
base *= base;
// ^^^^^^ That's another algorithm. I'll show you later.
正如评论中已经指出的那样,这里还有另一个问题
else if (power < 0) {
// ^^^^^^^^^ So, power is negative...
for (int i = 0; i <= power; i++) {
// ^^^^^ ^^^^^^^^^^ ^^^ But 'i' will never be.
永远不会执行该循环,这就是为什么当输入为 2、-2 时得到 0.5。
有很多方法可以完成这个任务。
double pow_iterative(double base, int power)
{
if (power == 0) {
return 1;
}
// Use a variable different from base, to store the partials.
double result = 1.0;
// That's another approach, so that you can write a single loop.
if ( power < 0 ) {
base = 1.0 / base;
power = -power;
}
// Note that we are modifying 'result', not base.
for (int i = 0; i < power; ++i) {
// ^^^
result *= base;
}
return result;
}
另一种算法称为平方求幂
double pow_(double base, int power)
{
double result = 1.0;
if ( power < 0 ) {
base = 1.0 / base;
power = -power;
}
for(;;) {
// If the power is odd, multiply once and "consume" the power
// b^n = b * b^(n-1)
if ( power % 2 ) {
result *= base;
--power;
}
// It may have been consumed or 0 from the beginning
if ( power == 0 )
break;
// The power is an even one, so we can square the base and halve the power
// b^(2n) = b^(n + n) = b^n * b^n = (b * b)^n
base *= base;
power /= 2;
}
return result;
}
你可以试试here.
我正在用 C 语言编写一个函数,它接受一个 float base 和 int power,并计算 base^power
到目前为止我有:
float powIteration(float base, int power){
if (power == 0){
return 1;
}
else if (power > 0){
for (int i = 0; i <= power; i++){
base *= base;
}
return base;
}
else if (power < 0){
for (int i = 0; i <= power; i++){
base *= base;
}
return 1/base;
}
}
我已经用递归解决了这个问题。但我也想用迭代来做。但出于某种原因,这段代码会产生类似 2^-2 = 0.5
的结果此外,这种方法甚至可以实现所谓的 "iterative approach" 吗?
由于我发现的第一个错误立即回答了最后一个,所以我想我会去测试并帮助你解决这个问题。
首先,您要在每次迭代中更改 base
,而您不希望这样,否则您不会每次都乘以一个值,而是每次迭代都不同。就像pm100说的:你要记住你原来的基地。示例:使用 base=2
和 power=-3
:
i=0 -> base *= base; 2*2 = 4;
i=1 -> now base is 4 so: 4*4 = 16;
i=2 -> now base is 8 so: 8*8 = 64; and you want it to be 2*2*2
最后1/value
会给你正确答案
同样在你的负循环中:你让你的循环从 0
开始,如果你的力量是 -2
,那么它不符合你的 运行 ] 条件 i <= power
因为你的 i
总是 > power
;
应该是这样的:
for (int i = power+1; i<0; i++)
我为你做了一些修改:
float powIteration(float base, int power){
float num=base;
if (power == 0){
return 1;
}else if (power > 0){
for (int i = 1; i < power; i++){
num=num*base;
}
return num;
}else if (power < 0){
for (int i = power+1; i<0; i++){
num=num*base;
}
return 1/num;
}
}
小心这种构造
if (...) { }
else if (...) { }
else if (...) { }
// ^^^^^^^^ Why the 'if'? It should just be an 'else'
您的编译器甚至可以警告您:
warning: non-void function does not return a value in all control paths [-Wreturn-type]
循环在几个方面是错误的
else if (power > 0) {
for (int i = 0; i <= power; i++) {
// ^^ That's an off by one error. Likely.
base *= base;
// ^^^^^^ That's another algorithm. I'll show you later.
正如评论中已经指出的那样,这里还有另一个问题
else if (power < 0) {
// ^^^^^^^^^ So, power is negative...
for (int i = 0; i <= power; i++) {
// ^^^^^ ^^^^^^^^^^ ^^^ But 'i' will never be.
永远不会执行该循环,这就是为什么当输入为 2、-2 时得到 0.5。
有很多方法可以完成这个任务。
double pow_iterative(double base, int power)
{
if (power == 0) {
return 1;
}
// Use a variable different from base, to store the partials.
double result = 1.0;
// That's another approach, so that you can write a single loop.
if ( power < 0 ) {
base = 1.0 / base;
power = -power;
}
// Note that we are modifying 'result', not base.
for (int i = 0; i < power; ++i) {
// ^^^
result *= base;
}
return result;
}
另一种算法称为平方求幂
double pow_(double base, int power)
{
double result = 1.0;
if ( power < 0 ) {
base = 1.0 / base;
power = -power;
}
for(;;) {
// If the power is odd, multiply once and "consume" the power
// b^n = b * b^(n-1)
if ( power % 2 ) {
result *= base;
--power;
}
// It may have been consumed or 0 from the beginning
if ( power == 0 )
break;
// The power is an even one, so we can square the base and halve the power
// b^(2n) = b^(n + n) = b^n * b^n = (b * b)^n
base *= base;
power /= 2;
}
return result;
}
你可以试试here.