C 程序在 OSX 和 Windows 上给出不同的结果

问题描述 投票:0回答:1

我用 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 作为她的编译器。

c macos
1个回答
6
投票

pow
log10
不需要正确舍入;它们产生的结果在平台之间可能会有所不同,即使对于“应该”与您的示例中完全相同的情况也是如此。 在这种情况下,OS X 生成的结果比 Windows 更准确,这会导致仅在 Windows 输出中显示的错误。

一个更好更好的解决方案是在整数中重复使用除法和乘法10,并且根本不使用浮点(有一个与您类似的非常干净的递归解决方案,不需要您计算

base
)。


顺便说一句:这是“可耻的”,这么多数学库不能正确处理 log10

log2
exp2
pow
中的 10 和 2 的小幂。 设计这些函数以使它们为这些情况做“正确的事情”并不难,并且可以在不对其他情况的性能产生不利影响的情况下完成。 虽然标准没有要求,但这是一件简单的事情,并且有助于使缺乏经验的程序员避免出现这样的(异常常见的)错误。
    

© www.soinside.com 2019 - 2024. All rights reserved.