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

标签 c macos compiler-construction

我用 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 机器以尝试在 Debug模式下运行程序,所以我已经一直很难猜测问题出在哪里。我将不胜感激任何见解!

环境:

我正在使用 OSX 10.8 和 GCC 4.2。我很确定我的讲师使用 MinGW 作为她的编译器。

最佳答案

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

一个好得多的解决方案是重复使用整数除以和乘以 10,并且根本不使用 float (有一个非常干净的递归解决方案与您的类似,不需要你计算 base)。


顺便说一句,一个小小的提示:可耻这么多数学库不能正确处理 log10log2 中的 10 和 2 的小幂exp2pow。设计这些函数以使其为这些情况做“正确的事情”并不难,并且可以在不对其他情况的性能产生不利影响的情况下完成。虽然标准没有要求,但这是一件简单的事情,它有助于使没有经验的程序员免于像这样的(异常常见的)错误。

关于C 程序在 OSX 和 Windows 上给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21057260/

相关文章:

Android 开源 (AOSP) 在 Mac OS X 上构建失败 : ld: symbol(s) not found for architecture x86_64

linux - Glibc 编译需要多长时间?

c - Windows 中是否有一种机制类似于 Linux 中的消息队列?

c - 带有 libsoup 的 HTTP POST

c++ - 链接列表示例 - 为什么使用它们?

java - 在不受支持的 Java 版本上运行 Java 包

c - 为什么在我的例子中多线程比顺序编程慢?

c - 如何在 mac os x 的内核扩展项目中使用 zlib?

c++ - VC 中哪种大小的结构成员对齐会带来性能优势?

c - 为什么 gcc 会创建冗余的汇编代码?