我应该总是使用适当的文字来表示数字类型吗?

时间:2012-10-30 16:26:34

标签: c++ floating-point numbers literals

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

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

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

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

这让我想知道:我总是使用适当的文字用于浮点数,双数,长数等吗?每当我能逃脱时,我通常会使用int literals,但我不确定这是否真的是一个好主意。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

我知道gcc有-Wconversion,但我不记得它涵盖的一切。

对于适合int的整数值,我通常不会限定longunsigned的值,因为通常会有更少的机会出现细微的错误。

答案 1 :(得分:1)

对于“应该”的问题,几乎从来没有一个绝对正确的答案。谁将使用此代码,为什么?这与此相关。但是,特别与浮动有关,最好养成准确指定所需操作的习惯。 float*float以单精度完成。任何带有double的东西都是双精度的,2会被转换为double,所以你在这里指定了不同的操作。

这里最好的答案是What Every Computer Scientist Should Know About Floating-Point Arithmetic。我会说,不要这样做,博士,浮点数没有简单的答案。