c - 幂函数给出的答案与 C 中的 math.pow 函数不同

标签 c pow math.h

我试图编写一个程序来使用 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 , powercopyx变量,调用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/

相关文章:

C 将大文件读入 char* 数组太慢

javascript - JavaScript 中 Math.pow() 在不同浏览器中的奇怪结果

c - pow(1,0) 返回 0?

c++ - 对重载函数的模糊调用 'pow'

c - 错误函数 erf(x),在 visual studio 2005 的 math.h 中找不到

ios - 将 FDLIBM 库集成到 iOS

c - 使用 LIRCd 检测按键

c++ - C 中快速复制的模式

c - Linux,C 将 cat 与 exec(3) 结合使用

c相当于matlab的sind和cost function