Почему printf не использует научную запись?

Я понимаю, что это общая проблема. Однако я не могу найти твердый прямой ответ.

16 ^ 54 = 1.0531229167e+65 (this is the result I want)

Когда я использую pow(16,54), я получаю:

105312291668557186697918027683670432318895095400549111254310977536.0

Код выглядит следующим образом:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

void main(){

   double public;
   double a = 16;
   double b = 54;
   public = (pow(a,b));

   printf("%.21f\n", public);
}

Код, выполненный с помощью:

gcc main.c -lm

Что я делаю неправильно?


person Simon.    schedule 22.01.2014    source источник
comment
Итак, вы хотите научное обозначение?   -  person Shafik Yaghmour    schedule 22.01.2014
comment
Также читайте о спецификаторе формата g.   -  person Yves Daoust    schedule 08.08.2017
comment
Ваш код демонстрирует UB (main() возвращает int, а не void или что-то еще, независимо от того, что кажется «работающим», независимо от того, сколько раз или на скольких системах он работает). ... на что, как я вижу, теперь указывает ответ. Хороший. В любом случае, UB — это плохие новости, но, к счастью, это легко исправить.   -  person Pryftan    schedule 15.10.2019


Ответы (3)


Что я делаю не так?

Несколько вещей:

  • Используйте формат %.10e для научной записи с printf для распечатки с десятью цифрами после точки,
  • Верните int из вашего main,
  • Подумайте о том, чтобы не использовать public для имени переменной, так как ваша программа должна быть перенесена на C++, где public — это ключевое слово.

Вот как вы можете исправить свою программу:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(){

   double p;
   double a = 16;
   double b = 54;
   p = (pow(a,b));

   printf("%.10e\n", p);
   return 0;
}

Демо на ideone.

person Sergey Kalinichenko    schedule 22.01.2014
comment
public не является ключевым словом в C. :) Хотя его использование будет проблематичным, если этот код когда-либо переместится на C++ - person abelenky; 22.01.2014
comment
@abelenky Ты прав, я пропустил тег. Спасибо за исправление! - person Sergey Kalinichenko; 22.01.2014

Ты пытался:

printf("%e\n", public);

Спецификатор %e предназначен для экспоненциального представления, как описано в документации.

person abelenky    schedule 22.01.2014

Если вам нужна научная запись, вам нужно использовать %e описатель формата:

printf("%e\n", public);
        ^^   

Кроме того, public — это ключевое слово в C++, поэтому было бы неплохо избегать этого. и любые другие ключевые слова, если этот код должен быть переносимым.

person Shafik Yaghmour    schedule 22.01.2014
comment
Забавные каламбуры: public [является] ключевым словомpublic находится в жутком C++), keywords в < i>case (также ключевое слово в C, C++ и других). Однако писать код с именами C++ — это отличная идея, чтобы предотвратить преобразования C++! Но вы правы, что если есть шанс, что будет желание портировать, то лучше этого не делать. - person Pryftan; 15.10.2019