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

我试图编写一个程序来使用 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

https://stackoverflow.com/questions/71426401/

相关文章:

javascript - Prop 验证中缺少 react / Prop 类型

c - 使用宏从一组给定的不同值中查找不等于任何值的值

r - 识别匹配对并创建一个公共(public) key

Flutter - 是否应该将 firebase_options.dart 添加到 gitignor

linux - "No Such Process"消耗GPU显存

javascript - 数组方法练习

rust - 如何在 CLI 应用程序中处理 "./"、 "~/"和相关参数

javascript - 如何根据属性值从单个对象数组创建多个对象数组

apache-kafka - 如何获取 Kafka Debezium MySQL 连接器的 data

spring-boot - 用 vaadin hilla 代替 flow 有什么好处