我在C中写了一个递归函数来反转一个整数(123 - > 321),当我在我的Mac上运行它时工作正常,但当我的教练在运行Windows的计算机上运行它时表现得很奇怪。
int rev(int num)
{
int base;
if (num < 10) return (num);
base = pow(10,(int)log10(num));
return(rev(num/10)+num%10*base);
}
例如,在OSX上调用rev(8765)返回5678,在Windows上,rev(8765)返回5672.我无法访问Windows机器以尝试在调试模式下运行程序,所以我已经一直在努力猜测问题是什么。我非常感谢任何见解!
环境:
我正在使用OSX 10.8和GCC 4.2。我很确定我的导师正在使用MinGW作为她的编译器。
答案 0 :(得分:6)
pow
和log10
不需要正确舍入;它们产生的结果可以并且将在平台之间有所不同,即使对于“应该”与您的示例中完全相同的情况也是如此。在这种情况下,OS X会产生比Windows更准确的结果,这会导致仅在Windows输出中显示的错误。
一个很多更好的解决方案是使用重复除法和乘以整数10,并且根本不使用浮点(有一个非常干净的递归解决方案,类似于你的,不需要你计算base
)。
顺便说一句,一个迷你咆哮:这是可耻的,许多数学库无法正确处理log10
,log2
,exp2
中的10和2的小权力{1}}和pow
。设计这些功能并不难,因为它们为这些情况做了“正确的事情”,并且可以在不对其他情况的性能产生不利影响的情况下完成。虽然标准不要求它,但这是一件简单的事情,它有助于拯救没有经验的程序员(如此常见)错误。