2009-10-16 1 views
4

Вот что я имею в виду, пытаясь сделатьстанд :: пау дает неверное приближение для дробных показателей

double x=1.1402 
double pow=1/3; 
std::pow(x,pow) -1; 

результат равен 0, но я ожидаю, 0.4465

уравнение (1 + x) ^3= 1.1402, найти x.

+2

Отладочный наконечник: было бы очевидно, что с pow() ничего не получается, если вы просто проверяете аргументы, передаваемые в pow(). Вы увидите, что значение второго аргумента было равно нулю, а не 1/3, показывая, что функция pow() работает правильно, и проблема заключается в вашем коде. –

+1

Хорошо, я уже решил это .. глупые ints – vehomzzz

+5

EVERYBODY допустил эту ошибку. – mob

ответ

8

1/3 делается в целочисленной арифметике, так что вы назначая от 0 до 'пау'. Попробуйте pow(x, 1.0/3.0);

18

1/3 равно 0. Это целочисленное деление.

Try:

double pow = 1.0/3.0; 

Для:

#include <iostream> 
#include <cmath> 

int main(void) 
{ 
double x = 1.1402; 
double pow = 1.0/3.0; 
std::cout << std::pow(x, pow) - 1; 

} 
+2

Ummm, ok ... \ * shrug \ * – GManNickG

+0

Иногда самый простой ответ выигрывает, иногда самый полный. StackOverflow также рандомизирует порядок ответов, поэтому иногда все выигрывает. Удача ничьей. –

+0

Более того, он уже принял мой ответ, а потом изменил его на тот. Я не обижаюсь, 13 голосов вполне достаточно, хотя в то время, когда я был maxed, и принятие было моим единственным методом получения репутации. Нет проблем, хотя :) – GManNickG

0

ваш 1/3 является целочисленное деление, результат целочисленного деления равен 0.

4

Многие утверждали, что 1/3 = 0, но не объясняет, почему это так.

C и C++ будут выполнять операцию, основанную на типах операндов. Поскольку оба операнда являются целыми числами, он выполняет целочисленное деление, создавая целочисленный результат. Когда он вынужден присваивать этот целочисленный результат двойной переменной, он преобразует целое число 0 в double 0.0.

Нет необходимости делать оба операнда двойными, если один из них удваивает, то компилятор будет преобразовывать другой в двойное, а также перед выполнением операции. 1.0/3 или 1/3.0 возвратят ожидаемый результат, как и 1.0/3.0.

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