代码之家  ›  专栏  ›  技术社区  ›  EMS

为什么双重打印的值与C中的浮点值相同,而它们的大小不同?

  •  1
  • EMS  · 技术社区  · 1 年前

    我需要使用进行计算。当我检查M_PI的精度时,它只打印了7位小数。所以我 #defined 我自己的 MY_PI 。但我仍然面临着同样的问题。 double 应支持15-17位十进制数字。为什么我只得到6

    #define MY_PI 3.1415926535897932384626433832795028841971
    #include<stdio.h>
    #include<math.h>
    int main()
    {
        printf("%f\n%lf\n%20lf\n",M_PI,M_PI,M_PI);
        printf("%d\n%d\n",sizeof(float),sizeof(double));
        printf("%f\n%lf\n%20lf\n",MY_PI,MY_PI,MY_PI);
        return 0;
    }
    
    

    执行代码的结果是,

    3.141593
    3.141593
                3.141593
    4
    8
    3.141593
    3.141593
                3.141593
    
    Process returned 0 (0x0)   execution time : 0.080 s
    Press any key to continue.
    
    
    
    3 回复  |  直到 1 年前
        1
  •  2
  •   Eric Postpischil    1 年前

    C不会将有关参数的类型信息传递给函数。 printf 从您传递的格式字符串中获取所有类型信息。

    由于历史原因,两者 %f %lf 告诉 输出函数 期待一个 double 论点根据C 2018 7.21.6.1 8, f 指示 输出函数 :

    A. 双重的 表示浮点数的参数在样式中转换为十进制表示法 [-]ddd.ddd ,其中小数点字符后的位数等于精度规范。如果精度缺失,则取6;

    因此,打印六位数字仅仅是因为这是默认值,而不是因为与类型有任何特别的关系。要查看更多数字,请请求更多数字:

    printf("%.60f\n", M_PI);
    

    这通常会打印:

    3.141592653589793115997963468544185161590576171875000000000000
    

    请注意 %20f 请求 字段宽度 共20个字符。字段宽度通常用于间距,以帮助对齐多行上的数据列。为了满足字段宽度,使用空格进行填充。上面的代码使用 %.60f 请求 精确 ,控制产生的位数。

        2
  •  2
  •   Lundin    1 年前
    • 传递给可变函数的所有内容,如 printf 经历了隐含的论证提升。万一 float ,它总是被提升到 double 所以 %f %lf 意思是一样的。只有两种不同的版本可供制作 输出函数 与一致 scanf 哪里 f vs %lf 事项。
    • 输出函数 除非你另有指示,否则要将小数的数量设为上限并四舍五入到6。
    • %20lf 只有告诉要打印多少个字符(用于对齐/填充空格等)。告诉它有多少 小数 要打印,请使用
      %.20lf 用一个 . 。或者如果你想要一个组合, %20.20lf .
    • 1415926535897932384626433832795028841971 属于类型 双重的 long double 。将其铸造到 浮动 然后将其传递给 输出函数 将导致预期的精度损失。

    示例(GNU C gcc -lm ):

      printf("%.20lf\n%.20lf\n",M_PI, (float)M_PI);
    

    输出

      3.14159265358979311600
      3.14159274101257324219
    
        3
  •  1
  •   Dario.Casciato    1 年前

    这是因为你给它的printf的精度。当使用%f或%lf时,printf函数总是只打印小数点后的6位数字。你必须告诉它你想要小数点后多少位数。看起来你试过这个,但方法不对。你必须在你想要看到的数字之前加一个点。

    实例

    printf("Test: %.20lf", MY_PI);