5

以下 2 行代码有什么区别?

#define F_SAMP 10000.0f

#define F_SAMP 10000.0

两个都不是浮动的吗?(顺便说一句,在这种特殊情况下,编译器是 XC16,但我认为这并不重要)感谢您的关注

4

5 回答 5

5

f带orF后缀的浮点常量有 type float,没有后缀的有 type double,带lorL后缀的有 type long double

首先,这会有所不同,因为值可以不同,如果值不是整数,通常会不同。例如,使用 和 最常用的格式floatdouble的值为123456789.123,456,789,但 的值为123456789.f123,456,792。

此外,如果将该值分配给 a float,则结果可能与f最初使用的常量不同。例如,之后:

float f0 = 9007198986305535.5f;
float f1 = 9007198986305535.5;

的值为f09,007,198,717,870,080,但 的值为f19,007,199,254,740,992。这是因为前几轮 9,007,198,986,305,535.5 直接到float,而后几轮先到double再到float

于 2022-01-10T01:49:33.960 回答
5

如果写小数点,字母“f”是否必要?

没有必要,但最好使用带有变量/数学的f-less 常量和带有后缀的常量。doubleffloat

两个都不是浮动的吗?

两者都有浮点数
但是floatdouble不一样。

类型差异

附加一个fmake 浮点常量类型float而不是double.

这可以引导到不同的代码_Generic以及<tgmath.h>浮点表达式中使用的数学。

鉴于通常的范围和精度差异,会出现细微的、有时不是那么细微的差异。

价值差异

告诉编译器f使用 a 通常更窄的范围和精度float
例如0.1 != 0.1f

有时它也会产生价值差异,即使分配给float.

于 2022-01-10T01:36:56.710 回答
3

f后缀使常量具有10000.0f类型float

常量10000.0有类型double

于 2022-01-10T01:16:42.743 回答
3

我不是 100% 确定 XC16,但通常省略尾随f会导致编译器将您的浮点数解释为double. 这f是专门告诉编译器它正在查看一个float.

于 2022-01-10T01:19:05.943 回答
3

f带有orF后缀的浮点常量的类型为float

没有后缀的浮点常量是类型double

l后缀为or的浮点常量L为 类型long double

这是三种不同的浮点类型。(根据实现,它们可能具有也可能不具有三种不同的表示形式。例如,具有相同大小和表示形式并不少见doublelong double

10000.0vs.的特定情况下10000.0f,它可能没有太大区别。像 10000.0 这样的小整数值通常可以在所有三种浮点类型中精确表示,因此任何隐式或显式转换都不会丢失任何信息。但是使用与将要使用的上下文相匹配的类型仍然是一个好主意。

请注意,如果省略小数点,10000则为整数常量(类型为int),并且10000f是语法错误。带或不带后缀的浮点上下文必须有小数点或指数。

这是一组比整数常量更简单的规则,其中有更多不同的类型、更多后缀,并且常量的类型可以取决于它的值。

于 2022-01-10T01:51:46.143 回答