3

我经常在表达式中使用错误的文字,例如将浮点数除以整数,如下所示:

float f = read_f();
float g = f / 2;

我相信在这种情况下编译器会首先将 int 文字 (2) 转换为浮点数,然后应用除法运算符。GCC 和 Clang 总是让类似的东西通过,但 Visual C++ 警告隐式转换。所以我必须这样写:

float f = read_f();
float g = f / 2.0f;

这让我想知道:我是否应该始终对 float、double、long 等使用适当的文字?每当我可以摆脱它时,我通常会使用 int 文字,但我不确定这是否真的是一个好主意。

  • 这可能是导致细微错误的原因吗?
  • 这只是表达式的问题还是函数参数的问题?
  • GCC 或 Clang 是否存在警告此类隐式转换的警告级别?
  • unsigned int,long int等怎么样?
4

2 回答 2

2

您应该始终明确指出您打算使用的文字类型。这将防止出现问题,例如这种代码:

float foo = 9.0f;
float bar = foo / 2;

更改为以下内容,截断结果:

int foo = 9;
float bar = foo / 2;

当您涉及重载和模板时,这也是函数参数的一个问题。

我知道 gcc 有-Wconversion,但我不记得它涵盖的所有内容。

对于适合的整数值,int我通常不会将它们限定为,long或者unsigned因为通常存在细微错误的机会要少得多。

于 2012-10-30T16:34:23.893 回答
1

对于“应该”的问题,几乎没有绝对正确的答案。谁将使用此代码,以及用于什么目的?这是相关的。而且,特别是对于与浮点数有关的任何事情,养成准确指定所需操作的习惯是很好的。 float*float以单精度完成。任何带有双精度的东西都是双精度的,2被转换为双精度,所以你在这里指定不同的操作。

这里最好的答案是What Every Computer Scientist Should Know About Floating-Point Arithmetic。我会说不要tl; dr它,浮点没有简单的答案。

于 2012-10-30T16:37:58.763 回答