繁体   English   中英

C++ 中的 LONG float 和 double 有什么区别?

[英]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这样的类型。

这篇文章为您提供了有关为什么人们使用lfprintf打印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%lfprintf ,但请注意,您不能使用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 年才被标准化。旧的编译器可能已经弃用了被更现代的编译器删除的旧功能。 %lflong float的遗产,它被继承到 C 的标准库中。

对于scanf你传递一个指向结果将被存储的位置的指针; 你用%f读取float值,用%lf读取双float值; 您必须区分它们,因为floatdouble不需要具有相同的表示形式。 对于printf您传入要显示的值,而float值被提升为double因为它们在原型的...部分作为参数传递; 也就是说,对于printffloatdouble之间没有区别,因此%f%lf做同样的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM