C++ C和C+中双浮点值的表示法+;

C++ C和C+中双浮点值的表示法+;,c++,floating-point,numbers,double,literals,C++,Floating Point,Numbers,Double,Literals,C/C++中双精度浮点值的表示法是什么 .5是表示双精度值还是浮点值 我很确定2.0f被解析为浮点数,2.0被解析为双精度,但是呢。5 是双倍的。在它后面加上f以获得float 这是参考文件的链接:它是双精度的。在它后面加上f以获得float 这里是参考文件的链接:从技术上讲,使用双常数初始化浮点值可能会导致与使用浮点值初始化不同的结果(即累积2个舍入误差) 以下是一个例子: #include <stdio.h> int main() { double d=8388609.4

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

.5
是表示双精度值还是浮点值

我很确定
2.0f
被解析为浮点数,
2.0
被解析为双精度,但是呢。5


是双倍的。在它后面加上f以获得float


这是参考文件的链接:

它是双精度的。在它后面加上f以获得float


这里是参考文件的链接:

从技术上讲,使用双常数初始化浮点值可能会导致与使用浮点值初始化不同的结果(即累积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);
}
该常数正好在基数2中:

100000000000000000000001.011111111111111111111111111111
基2表示法需要54位,双精度表示法只有53位。因此,当转换为double时,它将四舍五入到最接近的double,并与偶数匹配,从而:

100000000000000000000001.10000000000000000000000000000
100000000000000000000010.
基2表示法需要25位,float只有24位,因此如果将此double转换为float,则另一个舍入发生在最近的float,与偶数相等,因此:

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

100000000000000000000001.
正如我们所看到的,当初始化f2时,gcc将十进制表示形式转换为双精度,然后转换为浮点(检查行为是否由标准确定会很有趣)


尽管如此,由于这是一个精心编制的数字,大多数情况下您不应该遇到这种差异。

从技术上讲,使用双常量初始化浮点可能会导致与使用浮点常量初始化不同的结果(即累积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);
}
该常数正好在基数2中:

100000000000000000000001.011111111111111111111111111111
基2表示法需要54位,双精度表示法只有53位。因此,当转换为double时,它将四舍五入到最接近的double,并与偶数匹配,从而:

100000000000000000000001.10000000000000000000000000000
100000000000000000000010.
基2表示法需要25位,float只有24位,因此如果将此double转换为float,则另一个舍入发生在最近的float,与偶数相等,因此:

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

100000000000000000000001.
正如我们所看到的,当初始化f2时,gcc将十进制表示形式转换为双精度,然后转换为浮点(检查行为是否由标准确定会很有趣)


尽管如此,由于这是一个精心编制的数字,大多数情况下你不应该遇到这样的差异。

为什么
.5
.5f
的处理方式应该与
2.0
2.0f
的处理方式不同?好吧,也许不是那么明显。然而,在几乎所有语言中,小数点前的零是可选的。即使在袖珍计算器上键入数字:),但请注意:如果没有小数点符号,它将变成整数文字。后缀
f
是非法的,那么。。。还请注意,在大多数情况下,您不需要附加
f
,例如在
float x=.5中。编译器将把它当作一个浮点。(实际上,它是分配给浮点的双常量,但转换是在编译时完成的,因此它产生的程序代码与附加的
f
相同。)如果该值是整数,甚至可以省略小数点。但是,如果在上下文中同时接受float和double,则会很危险,例如函数重载等@leems是的,大多数情况下,当您使用文本初始化float变量时,可以省略f后缀,但并不总是如此,请看下面我的答案。为什么
.5
.5f
应该被区别对待,而不是
2.0
2.0f
?好吧,也许这并不明显。然而,在几乎所有语言中,小数点前的零是可选的。即使在袖珍计算器上键入数字:),但请注意:如果没有小数点符号,它将变成整数文字。后缀
f
是非法的,那么。。。还请注意,在大多数情况下,您不需要附加
f
,例如在
float x=.5中。编译器将把它当作一个浮点。(实际上,它是分配给浮点的双常量,但转换是在编译时完成的,因此它产生的程序代码与附加的
f
相同。)如果该值是整数,甚至可以省略小数点。但是,如果在上下文中同时接受float和double,则会变得很危险,例如函数重载等@leems是的,大多数情况下,当您使用文本初始化float变量时,您可以省略f后缀,但并非总是如此,请参见下面的答案。我在任何地方都没有看到提到过这一点,你们知道什么好的变量符号列表吗?@NT\U系统你们应该读的是“文字数字”。我想你在谷歌上找到了一些有用的参考资料。我在任何地方都没有看到提到过,你知道有什么好的变量符号列表吗?@NT\U系统这是你应该读的“文字数字”。我想你会在谷歌上找到一些有用的参考资料。那叫做