目前我是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);
}
问题:如何以单精度打印?
问题:要实现浮点程序的目标,需要在最后一个程序中更改什么?
我渴望学习,但这有点困难,因为我们不允许在大学了,因为新冠肺炎。我希望有人能给予我反馈。
谢谢,小特
2条答案
按热度按时间mfpqipee1#
printf
总是打印double,但这也意味着它可以打印float,因为任何float都可以转换为double而不损失精度。仅仅因为printf
打印了double并不意味着它可以神奇地增加float的精度。double是二进制的,所以说它可以存储15个十进制数字是没有意义的,真正的是打印的前15个十进制数字是准确的。
0lvr5msh2#
上面的代码是否实现了双精度目标?
不,
"%f"
只打印小数点后6位,即使对于大值不提供信息,对于小值也不足够。要打印所有精度,请使用"%a"
-但这不是十进制输出。若要以十进制打印,并具有足够的信息精度,请使用
"%.*e"
或"%.*g"
. Details。如果已超出内存,其他小数(16到20)从何而来?
这是十进制输出的产物,但浮点值是用二进制有效位编码的。精确打印某些
double
需要数百位。通常DBL_DIG
到DBL_DECIMAL_DIG
的有效位很有用:典型地为15至17。如何以单精度打印?
我需要在最后一个程序中改变什么来实现浮点程序的目标?
使用
float
变量和函数,并以指数表示法打印。使用FLT_DECIMAL_DIG
代替DBL_DECIMAL_DIG
。对于
float
,通常默认值为6位即可。第一个