2012-05-09 5 views
2

Я пишу программу для расчета отрицательных степеней 2. я использовал следующие два фрагмента кода:функция pow другой выход для cout и printf?

cout.precision(3); 
cout << scientific << pow(2.0, p) << endl; 

И

ans = pow(2.0, p); 
printf("%.3e\n", ans); 

Для p = -8271, то cout дает правильный ответ (1.517e -2490), но я получаю совсем другой ответ для printf (6.929e-310). Почему это несоответствие происходит?

Я использую Codeblocks на Ubuntu.

+4

Можем ли мы увидеть объявление переменной для 'ans'? Если это не тип 'double', вы можете передать неправильный тип аргумента' printf'. – templatetypedef

ответ

3

Держу пари, что ans является long double, но вы не указали printf, чтобы ожидать long double. Код формата, который вы хотите, - %.3Le, если предположить, что это так.

У компилятора g ++ даже есть предупреждение для определения несоответствий формата/параметра (я думаю, что он поставляется с -Wall), но я всегда предпочитаю iostreams, потому что они безопасны в этом виде.

Все это, конечно, предполагается, что p также является long double, в результате чего компилятор выбирает long double версию pow.

+0

ans длинный двойной. Марк Б, ты прав! Я изменил параметр на% .3Le, и теперь он работает красиво. Спасибо тонне за помощь. – varagrawal

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