C语言 浮点数和双精度浮点数的程序以及如何打印浮点数?

olmpazwi  于 2022-12-11  发布在  其他
关注(0)|答案(2)|浏览(382)

目前我是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 = %f, tan = %f\n", x, tan(x));
    }
    
    exit(0);
}

我得到的反馈是输出是双倍的。昨天我开始了一个与这段代码相关的线程,但由于出现了不同的问题,似乎适合开始一个新的。
循环的一般原理是可行的,但我被下一步该做什么所困。
让我们先来看看这个程序的double版本。因为我需要计算tan(x),而x并不是100%精确的,由于十进制的增量,我认为将变量定义为double是很重要的。昨天我知道printf函数的输出是double。因此我假设代码是正确的,目标是计算double。
这里我有一个小问题。我还打印了.20f,它给了我那个特定的窗口。我了解了一些关于32位和64位的知识。Double是64位的,可以在内存中存储15位小数。

问题:上述代码是否实现了双精度目标?
问题:如果已超出内存,其他小数(16到20)从何而来?

对于float版本的程序,我需要将变量定义为float。

double x;
double pi;

变成了

float x;
float pi;

接下来是printf语句,这里有点混乱,因为我现在知道printf函数以双精度输出,但我想要单精度,但仍然可以打印。我找不到另一个专门以单精度打印的函数。

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

int main()
{
    float x;

    float pi;
    pi = M_PI;

    for (x = 0; x <= pi / 2; x += pi / 20)
    {
        printf("x = %f, tan = %f\n", x, tan(x));
    }

    exit(0);
}

问题:如何以单精度打印?
问题:要实现浮点程序的目标,需要在最后一个程序中更改什么?

我渴望学习,但这有点困难,因为我们不允许在大学了,因为新冠肺炎。我希望有人能给予我反馈。
谢谢,小特

mfpqipee

mfpqipee1#

printf总是打印double,但这也意味着它可以打印float,因为任何float都可以转换为double而不损失精度。仅仅因为printf打印了double并不意味着它可以神奇地增加float的精度。
double是二进制的,所以说它可以存储15个十进制数字是没有意义的,真正的是打印的前15个十进制数字是准确的。

0lvr5msh

0lvr5msh2#

上面的代码是否实现了双精度目标?
不,"%f"只打印小数点后6位,即使对于大值不提供信息,对于小值也不足够。要打印所有精度,请使用"%a"-但这不是十进制输出。

// printf("x = %f, tan = %f\n",x, tan(x));
printf("x = %a, tan = %a\n",x, tan(x));

若要以十进制打印,并具有足够的信息精度,请使用"%.*e""%.*g". Details

printf("x = %.*e, tan = %.*e\n",DBL_DECIMAL_DIG-1,x, DBL_DECIMAL_DIG-1,tan(x));
printf("x = %.*g, tan = %.*g\n",DBL_DECIMAL_DIG  ,x, DBL_DECIMAL_DIG  ,tan(x));

如果已超出内存,其他小数(16到20)从何而来?
这是十进制输出的产物,但浮点值是用二进制有效位编码的。精确打印某些double需要数百位。通常DBL_DIGDBL_DECIMAL_DIG的有效位很有用:典型地为15至17。
如何以单精度打印?
我需要在最后一个程序中改变什么来实现浮点程序的目标?
使用float变量和函数,并以指数表示法打印。使用FLT_DECIMAL_DIG代替DBL_DECIMAL_DIG

// printf("x = %f, tan = %f\n",x, tan(x));
printf("x = %.*e, tan = %.*e\n",FLT_DECIMAL_DIG-1,x, FLT_DECIMAL_DIG-1, tanf(x));

对于float,通常默认值为6位即可。
第一个

相关问题