2013-08-26 2 views
3

Я застрял с этой ошибкой в ​​C и просто не могу понять, что происходит не так. Следующий запрос формирует неотъемлемую часть моего кода для постепенного увеличения значений в последовательных итерациях. Вот запрограммированная формула:ошибка в pow от math.h

Я прокомментировал ошибки в коде.

#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. Почему это происходит?

+0

Не так важно здесь, но вы должны попробовать привыкнуть всегда использовать 'std :: pow' от' cmath' вместо версии C от 'math.h'. 'std :: pow' включает в себя некоторые важные оптимизации для целочисленных показателей, в то время как' '' '' '' 'использует' double' экспоненты, независимо от того, что (нет перегрузки функций в C). –

ответ

9

Вашего фактор (int)1/(int)9 который (int)0; Почти все возведенные в степень нулевой является одним вы могли бы сделать что-то вроде этого

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

За исключением [Zero to the Zero] (http://stackoverflow.com/a/17368335/1708801) –

+5

Вам нужно '.' там (' 9.L') или оно будет 'long'. – chris

+0

@ShafikYaghmour добавил «почти» для ясности. – McKay

6

, если я не ошибаюсь, вы должны изменить коэффициент для

double factor = 1.0/9; 

Проблема заключается в том, что компилятор обрабатывает 1/9 как целочисленное деление, что приводит к 0. Итак, вы вычисляете мощность нуля, которая всегда равна 1.

Смежные вопросы