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