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

时间:2013-05-31 18:45:06

标签: c++ floating-point double

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

但是,在C ++中,当调用scanf和printf时,用于指定double的符号是“%lf”,这代表long float,对吧?因此,虽然浮点数不如双精度浮点数(LONG浮点数(假设长期浮点数,因为它可以通过更多项来“更长”)具有相同的精度,因此基本上是相同的东西?

只是澄清一下,这就是我的意思:

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

所以我的问题的根源:是否为double浮动另一个名字?

4 个答案:

答案 0 :(得分:14)

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

This post为您提供有关人们使用lf打印double printf的原因的信息,如果这是造成您混淆的原因。

由@Jerry Coffin提供:

  

“%f”是双精度的(或至少“a”)正确格式。浮点数没有格式,因为如果你试图将浮点数传递给printf,它会在printf接收之前提升为double。“%lf”在当前标准下也是可以接受的 - - 如果后跟f转换说明符(其中包括),则l被指定为无效。

原因是当人们这样做时:

 printf("The number is %lf", number);

相当于:

printf("The number is %f", number); //l has no effect when printing double

答案 1 :(得分:4)

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

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

float - >双 - >长双

%f - > %lf - > %的Lf

(另外,他们不能将printf双重说明符命名为%d,因为该名称已经为int的十进制表示保留(与八进制%o相比))

@ taocp的回答解释了为什么您可以将%f%lf同时用于printf,但请注意,您无法使用scanf

答案 2 :(得分:1)

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的值已删除,默认参数类型为int和double的值已从C99中删除。 C99标准需要函数原型,而不是函数声明,即int function_declaration();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的标准库。

答案 3 :(得分:0)

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