我试图编写一个程序来使用 while
循环计算 x^n 的值:
#include <stdio.h>
#include <math.h>
int main()
{
float x = 3, power = 1, copyx;
int n = 22, copyn;
copyx = x;
copyn = n;
while (n)
{
if ((n % 2) == 1)
{
power = power * x;
}
n = n / 2;
x *= x;
}
printf("%g^%d = %f\n", copyx, copyn, power);
printf("%g^%d = %f\n", copyx, copyn, pow(copyx, copyn));
return 0;
}
直到 n
的值为 15,我创建的函数和 pow
函数(来自 math.h
)的答案给出相同的值;但是,当 n
的值超过 15 时,它就会开始给出不同的答案。
我不明白为什么答案会有所不同。是我函数写错了还是其他原因?
最佳答案
您正在混淆两种不同类型的 float 据。 pow
函数使用 double
类型,但您的循环使用 float
类型(精度较低)。
您可以使用 double
来或者使结果一致输入您的 x
, power
和 copyx
变量,或调用powf
函数(使用 float
类型)而不是 pow
.
后一种调整(使用 powf
)给出了以下输出(clang-cl 编译器,Windows 10,64 位):
3^22 = 31381059584.000000
3^22 = 31381059584.000000
并且,更改您的 main
的第一行至 double x = 3, power = 1, copyx;
给出以下内容:
3^22 = 31381059609.000000
3^22 = 31381059609.000000
请注意,n
的值越来越大,您越来越有可能在循环结果与使用 pow
计算的值之间出现分歧。或 powf
库函数。在我的平台上,double
version 给出相同的结果,直到值超出范围并变为 Infinity
为止.然而,float
版本开始围绕 n = 55
出现分歧:
3^55 = 174449198498104595772866560.000000
3^55 = 174449216944848669482418176.000000
关于c - 幂函数给出的答案与 C 中的 math.pow 函数不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71426401/