【问题标题】:What's the difference between LONG float and double in C++?C++ 中的 LONG float 和 double 有什么区别?
【发布时间】:2013-05-31 18:45:05
【问题描述】:

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

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

澄清一下,我的意思是:

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

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

【问题讨论】:

  • 没有long float,编译器应该给你一个错误。不过从概念上讲,您可以将其称为 long float,这不会是错误的。
  • 我没有将它定义为长浮点数。对困惑感到抱歉。我对帖子进行了编辑以澄清。
  • @milleniumbug,但可能会有很长的两倍:msdn.microsoft.com/en-us/library/cc953fe1.aspx

标签: c++ floating-point double


【解决方案1】:

据我所知,没有long float 这样的类型。

This post 为您提供有关为什么人们使用lf 来打印doubleprintf 的信息,如果这是您感到困惑的原因。

@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

【讨论】:

  • 我在扫描双精度时使用%lf,它可以工作。根据下面的@milleniumbug,%f 没有。那么根据这个推理,%lf 不是双打的“正确”格式吗?
  • @Nealon 我认为这篇文章应该可以消除你的困惑,如果有的话:stackoverflow.com/questions/210590/…
【解决方案2】:

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

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

float -> double -> long double

%f -> %lf -> %Lf

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

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

【讨论】:

  • 这是有道理的。但是选择%lf 有什么原因吗?这显然不是随机的几个字母,'所以它确实代表Long Float,对吧?同样,我知道Long Float 不是类型。
  • @Nealon 有相当多的输入/显示格式只需要用 26 个字母进行编码,所以选择了%lf 来指定读取scanf() 中的double,因为@987654337 @ 已经表示 floatl 已经是表示“更大”的可选字母。如果您愿意,可以将其视为“长时间浮动”,但如果您不想让人发笑,请不要在公共场合这么称呼它。
  • @PascalCuoq 所以l 代表更大?这就是我需要知道的一切。我在学习 c++ 时被告知 l 代表了很长时间。
  • @Nealon l 是“长度”字符之一:en.wikipedia.org/wiki/Printf_format_string#Format_placeholders。请注意,此页面用于打印。该格式与有意义的扫描格式一致,但如您所知,存在细微的变化,包括%f 通常用于打印double
【解决方案3】:

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 才被删除。从 C99 中删除了自动返回 int 的类型,并删除了默认参数类型为 int 和 double。 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 的标准库继承。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多