C++ 定位整数除法引起的数值误差

C++ 定位整数除法引起的数值误差,c++,integer-division,C++,Integer Division,是否有g++警告或其他工具可以识别整数除法(向零截断)?我有数千行代码,其中的计算不可避免地会出现数字错误,通常是因为需要定位“float=int/int”。我需要一个合理的方法来找到这些。 注意:已完全编辑响应。请尝试-Wconversion 从gcc的手册页: 警告可能发生的隐式转换 改变一个值。这包括 实数和整数之间的转换, 当“x”是“double”时,类似于“abs(x)”; 有符号和有符号之间的转换 unsigned,比如“unsigned ui=-1”;和 转换为较小的类型,如 “

是否有g++警告或其他工具可以识别整数除法(向零截断)?我有数千行代码,其中的计算不可避免地会出现数字错误,通常是因为需要定位“float=int/int”。我需要一个合理的方法来找到这些。


注意:已完全编辑响应。

请尝试
-Wconversion

从gcc的手册页:

警告可能发生的隐式转换 改变一个值。这包括 实数和整数之间的转换, 当“x”是“double”时,类似于“abs(x)”; 有符号和有符号之间的转换 unsigned,比如“unsigned ui=-1”;和 转换为较小的类型,如 “sqrtf(MU PI)”。不要警告任何人 显式强制转换,如“abs((int)x)” 和“ui=(unsigned)-1”,或者 值不会因转换而更改 就像《abs(2.0)》一样。警告 有符号和有符号之间的转换 无符号整数可以由禁用 使用-Wno符号转换

对于C++,还警告转换 介于“NULL”和非指针类型之间; 混淆的重载解决方案 用户定义的转换;和 永远不会使用类型的转换 转换运算符:转换为 “void”,相同类型,基类或 对它们的引用。警告 有符号和有符号之间的转换 无符号整数被禁用 默认为C++ -Wsign转换已显式启用

对于以下示例程序(
test.cpp
),我在函数“int main()”中得到了错误
test.cpp:
test.cpp:7:警告:从“int”转换为“float”可能会改变其值

#include <iostream>

int main()
{
    int a = 2;
    int b = 3;
    float f = a / b;

    std::cout << f;

    return 0;
}
#包括
int main()
{
INTA=2;
int b=3;
浮动f=a/b;

std::cout我很难调用这些数字错误。您要求整数计算,并获得了整数计算的正确数字。如果这些数字不可接受,则要求进行浮点计算:

int x = 3;
int y = 10;

int z = x / y;

// "1." is the same thing as "1.0", you may want to read up on
// "the usual arithmetic conversions."  You could add some
// parentheses here, but they aren't needed for this specific
// statement.
double zz = 1. * x / y;

找出这种错误的最好方法是进行真正好的单元测试。所有的替代方案都不够好。

请注意: 将浮点变量的类型从
float
更改为
double
会使警告消失:

$ cat 'file.cpp'

#include <iostream>

int main()
{
   int a = 2;
   int b = 3;
   double f = a / b;

   std::cout << f;
}
$cat'文件.cpp'
#包括
int main()
{
INTA=2;
int b=3;
双f=a/b;
我们可以看看这个

它捕捉到这样的情况:

d = 32 * 8 / (2 + i);
d = 8 * floatFunc(1 + 7 / 2);
d = i / (1 << 4);
d=32*8/(2+i);
d=8*floatFunc(1+7/2);

d=i/(1)重载仅涉及基元类型的运算符是非法的;即,重载必须至少涉及一个UDT。是否存在操作系统限制?(对于静态分析工具建议).目前正在使用Debian 5.06,不久的将来可能会使用Debian 6.01。我使用gcc,但找不到任何警告可以捕捉到这个'double alpha=4/9/M_PI;
。我尝试了
-Wall
-Wextra`和
-Wconversion
。在我看来,涉及浮点和整数除法的表达式应该会给出警告。是的,没错。它们会ld更准确地称为“不正确的类型选择”比数字错误多。我以前尝试过此警告,但不幸的是,代码中有太多隐式转换,因此无法找出与整数除法相关的转换。在执行任何类型的代码清理之前,我需要解决数字错误,以便Wconversion在这种情况下有用。如果您有很多转换错误,为什么不直接通过
grep
float
过滤它们呢?