【问题标题】:Why is printf not using scientific notation?为什么 printf 不使用科学计数法?
【发布时间】:2014-01-22 16:06:06
【问题描述】:

我了解这是一个常见问题。但是我找不到一个可靠的直接答案。

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

我做错了什么?

【问题讨论】:

  • 所以你想要科学记数法?
  • 另请阅读g 格式说明符。
  • 您的代码是 UB(main() 返回 int - 不是 void 或其他任何东西,无论什么看起来“有效”,无论它运行了多少次或运行了多少个系统)。 ...我现在看到的答案指出了这一点。好的。无论如何 UB 是个坏消息,但幸运的是这个很容易修复。

标签: c printf pow


【解决方案1】:

我做错了什么?

几件事:

  • 使用%.10e 格式作为科学记数法,printf 用于打印输出,点后有十位数字,
  • 从您的main 返回一个int
  • 考虑不使用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;
}

Demo on ideone.

【讨论】:

  • public 不是 C 中的关键字。:) 尽管如果此代码迁移到 C++,它的使用会出现问题
  • @abelenky 你说得对,我错过了标签。谢谢指正!
【解决方案2】:

你试过了吗:

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

%e 说明符用于科学记数法,如 described in the documentation

【讨论】:

    【解决方案3】:

    如果你需要科学记数法,你需要使用%eformat specifier

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

    另外,public 是 C++ 中的 keyword,因此最好避免使用它和任何其他关键字,以防此代码需要可移植。

    【讨论】:

    • 有趣的双关语:public [is a] keyword(而 public 在可怕的 C++ 中),case 中的 >keywords(也是 C 和 C++ 中的关键字以及其他关键字)。使用 C++ 名称编写代码只是为了防止 C++ 转换,这是一个好主意!但是你是对的,如果有任何机会会有移植它的愿望,那么最好不要这样做。
    猜你喜欢
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2021-04-04
    • 2017-10-16
    相关资源
    最近更新 更多