![](/img/trans.png)
[英]What does the precision of float, double or long double mean in C++?
[英]What's the difference between LONG float and double in C++?
所以我知道浮点数和双精度数的精度有很大差异。 我明白了。 承诺。
但是,在 C++ 中,当调用 scanf 和 printf 时,用于指定 double 的符号是“%lf”,它代表 long float,对吗? 因此,虽然浮点数不如双精度数精确,但 LONG 浮点数(推测称为长浮点数,因为它可以通过更多项来“更长”)具有相同的准确性,因此本质上是相同的?
为了澄清,这就是我的意思:
double number = 3.14159;
printf("The number is %lf", number);
所以我的问题的根源是:long float 是 double 的另一个名字吗?
在我的知识范围内,没有像long float
这样的类型。
这篇文章为您提供了有关为什么人们使用lf
用printf
打印double
,如果这是造成您困惑的原因。
由@Jerry Coffin 提供:
“%f”是(或至少是“a”)双精度数的正确格式。 浮点数没有格式,因为如果您尝试将浮点数传递给 printf,它会在 printf 接收到它之前被提升为双精度数。 "%lf" 在当前标准下也是可以接受的——如果后跟 f 转换说明符(以及其他),则 l 被指定为无效。
所以原因是当人们这样做时:
printf("The number is %lf", number);
它相当于做:
printf("The number is %f", number); //l has no effect when printing double
printf
说明符名称与类型名称没有任何共同之处。
它们只是以这种方式命名,因此它们简短且易于记忆。
浮动 -> 双 -> 长双
%f -> %lf -> %Lf
(此外,他们不能将printf
双说明符命名为%d
因为该名称已经保留用于int
十进制表示(与八进制%o
相比))
@taocp 的回答解释了为什么您可以将%f
和%lf
与printf
,但请注意,您不能使用scanf
long float
是存在的 K&R C 第一版类型。 它是double
同义词。
第一个标准C89/C90后,去掉long float
。 它没有被弃用。 C89/C90也是K&R C第二版。 然后是称为 C94/C95 的多语言修正,它添加了wchar_t
以及诸如<iso646.h>
。
K&R C 第一版的许多功能已弃用,但直到第二个标准 C99 才删除。 删除了 int 的自动返回类型,并从 C99 中删除了 int 和 double 的默认参数类型。 C99 标准需要函数原型,而不是函数声明,即int function_declaration();
vs int function_prototype(void);
. 它还删除了 K&R C 风格的原型。
// implicit int type
main(argc, argv)
char ** argv;
// explicit int type
int main(argc, argv)
int argc;
char ** argv;
C++ 早在 C 被标准化之前就开始了。 模板在 1983 年标准化,这使得编译成 C 代码变得更加困难。 它直到 1998 年才被标准化。旧的编译器可能已经弃用了被更现代的编译器删除的旧功能。 %lf
是long float
的遗产,它被继承到 C 的标准库中。
对于scanf
你传递一个指向结果将被存储的位置的指针; 你用%f
读取float
值,用%lf
读取双float
值; 您必须区分它们,因为float
和double
不需要具有相同的表示形式。 对于printf
您传入要显示的值,而float
值被提升为double
因为它们在原型的...
部分作为参数传递; 也就是说,对于printf
, float
和double
之间没有区别,因此%f
和%lf
做同样的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.