以下 2 行代码有什么区别?
#define F_SAMP 10000.0f
#define F_SAMP 10000.0
两个都不是浮动的吗?(顺便说一句,在这种特殊情况下,编译器是 XC16,但我认为这并不重要)感谢您的关注
以下 2 行代码有什么区别?
#define F_SAMP 10000.0f
#define F_SAMP 10000.0
两个都不是浮动的吗?(顺便说一句,在这种特殊情况下,编译器是 XC16,但我认为这并不重要)感谢您的关注
f
带orF
后缀的浮点常量有 type float
,没有后缀的有 type double
,带l
orL
后缀的有 type long double
。
首先,这会有所不同,因为值可以不同,如果值不是整数,通常会不同。例如,使用 和 最常用的格式float
,double
的值为123456789.
123,456,789,但 的值为123456789.f
123,456,792。
此外,如果将该值分配给 a float
,则结果可能与f
最初使用的常量不同。例如,之后:
float f0 = 9007198986305535.5f;
float f1 = 9007198986305535.5;
的值为f0
9,007,198,717,870,080,但 的值为f1
9,007,199,254,740,992。这是因为前几轮 9,007,198,986,305,535.5 直接到float
,而后几轮先到double
再到float
。
如果写小数点,字母“f”是否必要?
没有必要,但最好使用带有变量/数学的f
-less 常量和带有后缀的常量。double
f
float
两个都不是浮动的吗?
两者都有浮点数。
但是float
和double
不一样。
类型差异
附加一个f
make 浮点常量类型float
而不是double
.
这可以引导到不同的代码_Generic
以及<tgmath.h>
浮点表达式中使用的数学。
鉴于通常的范围和精度差异,会出现细微的、有时不是那么细微的差异。
价值差异
告诉编译器f
使用 a 通常更窄的范围和精度float
。
例如0.1 != 0.1f
。
有时它也会产生价值差异,即使分配给float.
f
后缀使常量具有10000.0f
类型float
。
常量10000.0
有类型double
。
我不是 100% 确定 XC16,但通常省略尾随f
会导致编译器将您的浮点数解释为double
. 这f
是专门告诉编译器它正在查看一个float
.
f
带有orF
后缀的浮点常量的类型为float
。
没有后缀的浮点常量是类型double
。
l
后缀为or的浮点常量L
为 类型long double
。
这是三种不同的浮点类型。(根据实现,它们可能具有也可能不具有三种不同的表示形式。例如,具有相同大小和表示形式并不少见double
。long double
)
在10000.0
vs.的特定情况下10000.0f
,它可能没有太大区别。像 10000.0 这样的小整数值通常可以在所有三种浮点类型中精确表示,因此任何隐式或显式转换都不会丢失任何信息。但是使用与将要使用的上下文相匹配的类型仍然是一个好主意。
请注意,如果省略小数点,10000
则为整数常量(类型为int
),并且10000f
是语法错误。带或不带后缀的浮点上下文必须有小数点或指数。
这是一组比整数常量更简单的规则,其中有更多不同的类型、更多后缀,并且常量的类型可以取决于它的值。