6

所以我知道浮点数和双精度数的精度有很大差异。我明白了。承诺。

但是,在 C++ 中,当调用 scanf 和 printf 时,用于指定双精度的符号是“%lf”,它代表长浮点数,对吗?因此,虽然浮点数不如双精度浮点数,但 LONG 浮点数(假定称为长浮点数,因为它可以通过具有更多项而“更长”)具有相同的精度,因此本质上是一样的?

只是为了澄清,这就是我的意思:

double number = 3.14159;
printf("The number is %lf", number);

所以我的问题的根源是:long float 是 double 的另一个名称吗?

4

4 回答 4

18

long float在我的知识范围内没有这样的类型。

如果这是造成您困惑的原因,这篇文章会为您提供有关人们为什么使用lf打印double的信息。printf

由@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
于 2013-05-31T18:52:19.337 回答
5

printf说明符名称与类型名称没有任何共同之处。

它们只是这样命名的,因此它们简短易记。

浮动 -> 双 -> 长双

%f -> %lf -> %Lf

(此外,他们不能命名printfdouble 说明符,%d因为该名称已保留用于int(与 octal 相比%o)的十进制表示)

@taocp 的回答解释了为什么你可以同时使用%f%lfwith printf,但请注意你不能这样做scanf

于 2013-05-31T18:53:28.563 回答
3

是存在的long floatK&R C 第一版类型。它是 的同义词double

在第一个标准 C89/C90 之后,long float被删除。它没有被弃用。C89/C90 也是 K&R C 第二版。然后是称为 C94/C95 的多语言修正案,它增加wchar_t<iso646.h>.

K&R C 第一版的许多功能已被弃用,但直到第二个标准 C99 才被删除。从 C99 中删除了自动返回 int 的类型,并删除了默认参数类型为 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 年才被标准化。旧的编译器可能已经弃用了被更现代的编译器删除的旧功能。这是C 标准库%lf的遗产。long float

于 2019-12-25T10:42:50.177 回答
0

因为scanf您将指针传递给将存储结果的位置;你用 ; 读取一个float%f和一个双精度值%lf;您必须区分它们,因为float并且double不需要具有相同的表示。因为printf您传入要显示的值,并且float值被提升为double因为它们在...原型部分中作为参数传递;也就是说,因为a和 aprintf之间没有区别,所以and做同样的事情。floatdouble%f%lf

于 2013-05-31T23:23:26.257 回答