math.h中pow函数出错

3

我在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,即.11111时,我得到了正确的值,如b = pow(100, .1111) = 1.66800。这是为什么?


虽然这并不是很重要,但你应该尝试养成使用 cmath 中的 std::pow 而不是 math.h 中的 C 版本的习惯。std::pow 包含了一些针对整数指数的重要优化,而 C 的 pow 则无论如何都使用 double 指数(C 中没有函数重载)。 - Benjamin Bannier
2个回答

9
您的因子是(int)1 / (int)9,其为(int)0; 几乎任何数的零次方都为一,您可以像这样做:
double factor = 1/9.0; // make sure the 9 is a floating point

5
你需要在那里加上一个“.”(至少是第9位)否则它将成为一个“long”。 - chris
@ShafikYaghmour为了更清晰,加了一个“几乎”。 - McKay
1
"1/9L" 仍然是零。 "9L" 是一个“long”,而不是“long double”。 - Keith Thompson
2
你不需要一个 long double,你需要一个 double。你需要 9.(或 9.0)。 - Mike Seymour
@ShafikYaghmour,你在挑剔一个无关紧要的小问题。 - Jiminion

6
如果我没记错的话,你需要将因子改为
double factor = 1.0/9;

问题在于编译器将1/9视为整数除法,导致结果为0。因此你计算的是0的次方,结果总是1。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接