Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何以双精度打印?_C_Floating Point_Double - Fatal编程技术网

C 如何以双精度打印?

C 如何以双精度打印?,c,floating-point,double,C,Floating Point,Double,我对C完全是新手,我正在努力完成一项作业。练习是打印tan(x),x从0增加到pi/2 我们需要用浮点和双精度打印。我写了一个程序,似乎工作,但我只打印浮动,而我预期的双 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { double x; double pi; pi = M_PI; for (x = 0; x<

我对C完全是新手,我正在努力完成一项作业。练习是打印tan(x),x从0增加到pi/2

我们需要用浮点和双精度打印。我写了一个程序,似乎工作,但我只打印浮动,而我预期的双

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

int main()
{
    double x;
    
    double pi;
    pi = M_PI;
     
    for (x = 0; x<=pi/2; x+= pi/20)
    {
        printf("x = %lf, tan = %lf\n",x, tan(x));
        
    }
    
    exit(0);
}
#包括
#包括
#包括
int main()
{
双x;
双pi;
pi=M_-pi;
对于(x=0;x“…但我只打印了
浮动
,而我预期的是
双精度

实际上,您正在输出
double

函数(包括)的
float
参数通常隐式提升为
double

所以即使你的声明

printf("x = %lf, tan = %lf\n",x, tan(x));
更改为:

    printf("x = %f, tan = %f\n",x, tan(x));
它仍然会输出
double
,因为
%f“
%lf”
都被用作
printf()
(和其他可变函数)的
double
格式说明符

编辑以在评论中回答以下陈述/问题:

“我知道双精度记数法有15位[精度]。”

是的。但是,
float
/
double
数据类型的实际
IEEE 754
指定特性与使用
printf()
函数中的格式说明符使其显示的方式之间存在差异

简单来说:

  • double
    的精度是
    float
    的两倍

  • float
    是一个32位单精度浮点数,符号为1位,指数为8位,值为24*,精度为7位小数

    printf("%.50f\n%.25f\n", 123.45, 123.45f);
    // 123.45000000000000284217094304040074348449710000000000
    // 123.4499969482421875000000000
    
  • double
    是一个64位双精度浮点数,符号为1位,指数为11位,数值为53*位,精度为15位小数

    printf("%.50f\n%.25f\n", 123.45, 123.45f);
    // 123.45000000000000284217094304040074348449710000000000
    // 123.4499969482421875000000000
    
*
-包括隐式位(对于正常数字总是等于1,对于次正常数字总是等于0。此隐式位不存储在内存中),但不包括符号位

“…但是使用%.20f我可以打印更多的数字,这是怎么可能的?这些数字是从哪里来的?”

额外的数字是由模拟数的二进制表示引起的不准确,再加上使用宽度说明符强制显示比存储值实际表示的信息更多的信息

虽然宽度说明符有适当的位置,但它们也可能导致提供误导性结果

为什么我将变量定义为
double
,并在printf函数中使用
%lf
,却得到float

代码没有得到“浮点数”,输出只是文本。即使编码的参数是浮点数双精度,输出也是浮点数的文本翻译-通常四舍五入

printf()
仅遵循
%lf”
的行为:打印小数点后6位的浮点值。使用
printf()
%lf”
执行与
%f”
完全相同的操作

要获得双倍输出,我需要更改什么

无,输出为文本,而不是双精度。要查看更多数字,请以更高的精度打印

printf("%.50f\n%.25f\n", 123.45, 123.45f);
// 123.45000000000000284217094304040074348449710000000000
// 123.4499969482421875000000000
如何操作代码,使输出采用浮点表示法

尝试使用指数表示法的
“%e”
“%a”
。要更好地了解要打印的位数:


您没有使用
float
printf()格式
%lf
用于
长双精度
。格式
%f
用于
双精度
float
值在传递到
printf()时升级为
双精度
float
没有格式(与
f()不同)
)。如果您想要更多的小数位数,您可以使用例如
%.12f
。那么您得到的输出会让您认为没有打印双精度吗?我使用了在线C编译器,得到的输出有6位小数。我知道双精度有15位小数,所以因为我没有看到那么多的小数位数,所以我需要我以为它是一个浮点数。()根据我在这里得到的反馈,我现在知道我的输出是双精度的,我可以用多少位数来决定输出。但是我如何操作代码,使我的输出是浮点数?没有“浮点数”这样的东西.
float
double
具有不同的精度,但这并不能映射到精确的十进制数字数。如果要打印数字的位数或多或少,或使用固定位数,或使用科学记数法,或进行其他修改,则可以更改格式说明符;请参阅
printf
了解详细信息。感谢您的反馈!如果我的输出已经是双精度的,那么由于printf函数将变量提升为双精度,我如何将其转换为浮点数?我知道双精度表示法有15位精度。但是使用%.20f我可以打印更多的数字,这是怎么可能的?这些数字来自何处?@Terr070-请参阅编辑细节以回答你的评论的底部。(如果这已经解决了你的问题,考虑通过点击空洞的复选标记在答案的顶部接受。)