【问题标题】:Notation of double floating point values in C and C++C 和 C++ 中双浮点值的表示法
【发布时间】:2012-11-07 19:34:31
【问题描述】:

C/C++ 中双精度浮点值的表示法是什么?

.5 代表的是双精度值还是浮点值?

我很确定 2.0f 被解析为浮点数,2.0 被解析为双精度,但 0.5 呢?

http://c.comsci.us/etymology/literals.html

【问题讨论】:

  • 为什么.5 vs. .5f2.0 vs. 2.0f 区别对待?
  • 好吧,也许不是那么明显。但是,几乎在每种语言中,小数点符号前的零都是可选的。即使在袖珍计算器上输入数字:)
  • 但请注意:没有小数点,它会变成整数文字。后缀f 是非法的... 另请注意,在大多数情况下,您不需要附加f,例如在float x = .5; 中。编译器会将其视为浮点数。 (实际上,它是一个分配给浮点数的双精度常量,但转换是在编译时完成的,因此它生成的程序代码与附加f 时相同。)如果该值是整数,您甚至可以省略小数符号。但是,如果在上下文中接受 float 和 double 会变得很危险,例如关于函数重载等。
  • @leemes 是的,大多数情况下,您可以在使用文字初始化浮点变量时省略 f 后缀,但并非总是如此,请参阅下面的答案。

标签: c++ floating-point numbers double literals


【解决方案1】:

是双倍的。后缀为 f 以获得浮动。

这里是参考文档的链接:http://en.cppreference.com/w/cpp/language/floating_literal

【讨论】:

  • 我没有看到任何地方提到过,你知道有什么好的变量符号列表吗?
  • @NT_SYSTEM 这是您应该阅读的“文字数字”。我认为您在 google 上找到了一些有用的参考资料。
【解决方案2】:

从技术上讲,使用双精度常量初始化浮点数可能会导致与使用浮点常量初始化不同的结果(即累积 2 次舍入误差)。

这是一个例子:

#include <stdio.h>
int main() {
    double d=8388609.499999999068677425384521484375;
    float f1=8388609.499999999068677425384521484375f;
    float f2=8388609.499999999068677425384521484375;
    float f3=(float) d;
    printf("f1=%f f2=%f f3=%f\n",f1,f2,f3);
}

使用 gcc 4.2.1 i686 我得到了

f1=8388609.000000 f2=8388610.000000 f3=8388610.000000

这个常数正好是底数 2:

100000000000000000000001.011111111111111111111111111111

Base 2 表示需要 54 位,双精度只有 53 位。因此,当转换为双精度时,它会四舍五入到最接近的双精度,与偶数相等,因此:

100000000000000000000001.10000000000000000000000000000

Base 2 表示需要 25 位,float 只有 24 位,所以如果你将这个 double 转换为 float,那么另一个舍入会发生在最接近的 float 上,绑定到偶数,因此:

100000000000000000000010.

如果将第一个数字直接转换为浮点数,则单次舍入不同:

100000000000000000000001.

正如我们所见,在初始化 f2 时,gcc 将十进制表示转换为双精度,然后再转换为浮点(检查行为是否由标准确定会很有趣)。

不过,由于这是一个特制的数字,大多数时候你不应该遇到这样的差异。

【讨论】:

猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 2016-05-10
  • 2021-05-08
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多