如何以双精度打印?
How do I print in double precision?
我是 C 语言的新手,我正在努力完成一项作业。练习是打印 tan(x),其中 x 从 0 递增到 pi/2.
我们需要以 float 和 double 格式打印它。我写了一个似乎可以工作的程序,但我只打印了浮点数,而我期望是双倍的。
#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);
}
我的问题是:
为什么我在 printf 函数中将变量定义为 double 并使用 %lf 时得到浮点数?
我需要更改什么才能获得双打输出?
"...但我只打印了 floats
,而我期望 double
"
您实际输出的是 double
个值。
float
个参数到 variadic functions (including printf()) are implicitly promoted to double
in general. 。
所以即使你的声明
printf("x = %lf, tan = %lf\n",x, tan(x));
已更改为:
printf("x = %f, tan = %f\n",x, tan(x));
它仍然会输出 double
,因为 "%f"
和 "%lf"
都用作 printf()
(和其他可变参数函数)的 double
格式说明符。
编辑 以解决评论中 statement/questions 之后的问题:
"我知道双符号有15位[精度]。"
是的。但是 float
/double
数据类型的实际 IEEE 754
指定特征与使用格式说明符在 [=21= 中显示它们的方式之间存在差异] 函数。
简单来说:
double
具有 double (2x) float
.
的精度
float
是一个 32 位 IEEE 754 单精度浮点数,其中 1 位用于符号,8 位用于指数,24* 的值,导致 7 decimal 位精度。
double
是一个 64 位 IEEE 754 双精度浮点数,符号位为 1 位,指数位为 11 位,53* 位的值导致 15 十进制 位精度。
*
- 包括隐式位(对于正规数始终等于 1,对于次正规数始终等于 0。此隐式位不存储在内存中),但不包括符号位。
"...但是使用 %.20f 我能够打印更多数字,这怎么可能,这些数字是从哪里来的?"
额外的数字是由模拟数字的二进制表示造成的不准确,加上使用宽度说明符强制显示比存储值实际表示的信息更多的信息。
尽管宽度说明符有其应有的位置,但它们也可能导致提供误导性结果。
Why do I get floats, while I defined the variables as double
and used %lf
in the printf function?
代码没有得到“浮点数”,输出只是文本。即使编码的参数是 float
或 double
,输出也是浮点数的文本翻译 - 通常四舍五入。
printf()
简单地遵循了 "%lf"
的行为:打印小数点后 6 位的浮点值。对于 printf()
,"%lf"
的表现与 "%f"
.
完全相同
printf("%lf\n%lf\n%f\n%f\n", 123.45, 123.45f, 123.45, 123.45f);
// 123.450000
// 123.449997
// 123.450000
// 123.449997
What do I need to change to get doubles as output?
没什么,输出的是文本,不是double
。要查看更多数字,请更精确地打印。
printf("%.50f\n%.25f\n", 123.45, 123.45f);
// 123.45000000000000284217094304040074348449710000000000
// 123.4499969482421875000000000
how do I manipulate the code so that my output is in float notation?
尝试 "%e"
、"%a"
指数表示法。为了更好地了解要打印多少位数字:Printf width specifier to maintain precision of floating-point value.
printf("%.50e\n%.25e\n", 123.45, 123.45f);
printf("%a\n%a\n", 123.45, 123.45f);
// 1.23450000000000002842170943040400743484497100000000e+02
// 1.2344999694824218750000000e+02
// 0x1.edccccccccccdp+6
// 0x1.edccccp+6
printf("%.*e\n%.*e\n", DBL_DECIMAL_DIG-1, 123.45, FLT_DECIMAL_DIG-1,123.45f);
// 1.2345000000000000e+02
// 1.23449997e+02
我是 C 语言的新手,我正在努力完成一项作业。练习是打印 tan(x),其中 x 从 0 递增到 pi/2.
我们需要以 float 和 double 格式打印它。我写了一个似乎可以工作的程序,但我只打印了浮点数,而我期望是双倍的。
#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);
}
我的问题是:
为什么我在 printf 函数中将变量定义为 double 并使用 %lf 时得到浮点数?
我需要更改什么才能获得双打输出?
"...但我只打印了 floats
,而我期望 double
"
您实际输出的是 double
个值。
float
个参数到 variadic functions (including printf()) are implicitly promoted to double
in general.
所以即使你的声明
printf("x = %lf, tan = %lf\n",x, tan(x));
已更改为:
printf("x = %f, tan = %f\n",x, tan(x));
它仍然会输出 double
,因为 "%f"
和 "%lf"
都用作 printf()
(和其他可变参数函数)的 double
格式说明符。
编辑 以解决评论中 statement/questions 之后的问题:
"我知道双符号有15位[精度]。"
是的。但是 float
/double
数据类型的实际 IEEE 754
指定特征与使用格式说明符在 [=21= 中显示它们的方式之间存在差异] 函数。
简单来说:
的精度double
具有 double (2x)float
.float
是一个 32 位 IEEE 754 单精度浮点数,其中 1 位用于符号,8 位用于指数,24* 的值,导致 7 decimal 位精度。double
是一个 64 位 IEEE 754 双精度浮点数,符号位为 1 位,指数位为 11 位,53* 位的值导致 15 十进制 位精度。
*
- 包括隐式位(对于正规数始终等于 1,对于次正规数始终等于 0。此隐式位不存储在内存中),但不包括符号位。
"...但是使用 %.20f 我能够打印更多数字,这怎么可能,这些数字是从哪里来的?"
额外的数字是由模拟数字的二进制表示造成的不准确,加上使用宽度说明符强制显示比存储值实际表示的信息更多的信息。
尽管宽度说明符有其应有的位置,但它们也可能导致提供误导性结果。
Why do I get floats, while I defined the variables as
double
and used%lf
in the printf function?
代码没有得到“浮点数”,输出只是文本。即使编码的参数是 float
或 double
,输出也是浮点数的文本翻译 - 通常四舍五入。
printf()
简单地遵循了 "%lf"
的行为:打印小数点后 6 位的浮点值。对于 printf()
,"%lf"
的表现与 "%f"
.
printf("%lf\n%lf\n%f\n%f\n", 123.45, 123.45f, 123.45, 123.45f);
// 123.450000
// 123.449997
// 123.450000
// 123.449997
What do I need to change to get doubles as output?
没什么,输出的是文本,不是double
。要查看更多数字,请更精确地打印。
printf("%.50f\n%.25f\n", 123.45, 123.45f);
// 123.45000000000000284217094304040074348449710000000000
// 123.4499969482421875000000000
how do I manipulate the code so that my output is in float notation?
尝试 "%e"
、"%a"
指数表示法。为了更好地了解要打印多少位数字:Printf width specifier to maintain precision of floating-point value.
printf("%.50e\n%.25e\n", 123.45, 123.45f);
printf("%a\n%a\n", 123.45, 123.45f);
// 1.23450000000000002842170943040400743484497100000000e+02
// 1.2344999694824218750000000e+02
// 0x1.edccccccccccdp+6
// 0x1.edccccp+6
printf("%.*e\n%.*e\n", DBL_DECIMAL_DIG-1, 123.45, FLT_DECIMAL_DIG-1,123.45f);
// 1.2345000000000000e+02
// 1.23449997e+02