【问题标题】:error in pow from math.h来自 math.h 的 pow 错误
【发布时间】:2023-04-02 02:30:02
【问题描述】:

我在 C 中遇到了这个错误,只是无法弄清楚出了什么问题。以下查询构成了我的代码的一个组成部分,用于在连续迭代中以指数方式递增值。这是我编写的公式:

我已经注释了代码中的错误。

#include <math.h>
#include <iostream>

int main()
{
    double maxMeshS = 0;
    double minMeshS = 0;

    cout << "enter max mesh size (m): ";
    cin >>maxMeshS;

    cout <<"\nenter min mesh size (m): ";
    cin >> minMeshS;

    double raise = maxMeshS/minMeshS; //Values used for run maxMeshS = .5
    double factor = 1/9;              //                    minMeshS = .005    

    double b = pow(raise,factor);
    cout << "b " << b << endl;  // The error happens here when I use above values
                               // b comes out to be 1 which should be 1.668100 instead
    double a = minMeshS/b;
    cout << "a " << a << endl;

    int x;
    cout << "enter x " ;
    cin >> x;

    double queryCube = a*pow(b,x);
    cout << queryCube << endl;
    return(0);
}

但是,当我对除法 maxMeshS/minMeshS 即 100 和 1/9 即 0.11111 使用计算值时,我获得了 b = pow(100, .1111) = 1.66800 的正确值。为什么会这样?

【问题讨论】:

  • 这里没那么重要,但您应该尝试养成始终使用cmath 中的std::pow 而不是math.h 中的C 版本的习惯。 std::pow 包括对整数指数的一些重要优化,而 C 的 pow 无论如何都使用 double 指数(C 中没有函数重载)。

标签: c++ c pow math.h


【解决方案1】:

你的因数是(int)1 / (int)9,也就是(int)0; 几乎所有的零次方都是一 你可以做这样的事情

double factor = 1/9.0; // make sure the 9 is a floating point

【讨论】:

  • 你需要一个.(至少9.L),否则就是long
  • @ShafikYaghmour 为清楚起见添加了“几乎”。
  • 1/9L 仍然为零。 9Llong,而不是 long double
  • 你不想要long double,你想要double。你想要9.(或9.0)。
  • @ShafikYaghmour,你在挑一个无关紧要的问题。
【解决方案2】:

如果我没记错的话,你得把因子改成

double factor = 1.0/9;

问题在于编译器确实将 1/9 视为整数除法,结果为 0。 所以你计算零的幂,它总是 1。

【讨论】:

    猜你喜欢
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2012-07-14
    相关资源
    最近更新 更多