【问题标题】:Windows/Visual Studio going wonky on a perfectly fine C programWindows/Visual Studio 在完美的 C 程序上变得不稳定
【发布时间】:2020-11-03 20:45:44
【问题描述】:

好吧,不要自负,也许程序中有些东西很有趣,但是 GCC 和 Clang 正在编译它并按照预期在 Ubuntu 20.04 和 MacOS 10.14 上运行它。 Win 7 上的 Visual Studio 2013 ?那是另一回事。

    #include <stdio.h>
    #include <math.h>

    int main()
    {   double num1, num2, result; 
        printf("\nEnter numbers : ");
        scanf("%lf %lf", &num1, &num2);
        result = pow(num1,num2);
        printf("\n%s %lf\n","Result = ",result);
   }

酷吗?在 Mac/Linux 上,当我尝试 128^128 时,我得到了准确的答案528294531135665246352339784916516606518847326036121522127960709026673902556724859474417255887657187894674394993257128678882347559502685537250538978462939576908386683999005084168731517676426441053024232908211188404148028292751561738838396898767036476489538580897737998336.000000

当在 V.S.2013 中编译时没有错误或警告,并在同一台机器 (Win7Pro) 上运行时,我得到:

52829453113566525 后跟许多零,这样答案的位数与上述答案相同。

我可以验证它的相同代码,我在这些平台上使用相同的 .c 文件,我看到的唯一变量是编译器和操作系统。像我这样的小开发人员能做些什么来解决微软的烂摊子(看起来就是这样)吗??

注意:所有操作系统都是 64 位的。

编辑:这是来自更大项目 MathHack 的最小可重现示例,可在 @sites.google.com/view/mathhack 获得完整的源代码可在该网站上找到,尽管我怀疑其余代码存在问题。

编辑 2:截图 -

在 MacOSX 10.14 上工作 --

https://drive.google.com/file/d/1I0T75vJAUPnbK8y-oCkl_rHSqLTvCWzv/view?usp=sharing

在 Win7 SP2 上不工作 --

https://drive.google.com/file/d/148EuhwYlrWRom4fIPT_wfkxdSIYya3ep/view?usp=sharing

编辑 3:

这可能是 Microsoft 实现的 printf() 中的一个错误。嘘。我会升级到最新的 VS 看看能不能解决这个问题。

【问题讨论】:

  • 每个实现的指数和尾数是否可能不同?
  • 您如何获得128^128 的正确答案?甚至可以用long double 来表示这个数字吗?
  • @FiddlingBits 如果需要,我可以附上截图。无论出于何种原因,它似乎在 Mac 终端 [drive.google.com/file/d/1I0T75vJAUPnbK8y-oCkl_rHSqLTvCWzv/…] 的这个基于 Unix 的系统 SS 上工作
  • @MSDN 说我不知道​​该怎么做。你能帮我写一个答案告诉我怎么做吗?
  • 128^128 在二进制中是 1 后跟 896(或者可能是 895)零,对于 IEEE doubles 来说非常好。

标签: c windows visual-studio binary windows-7


【解决方案1】:

这不是答案,但 cmets 不显示图像:

Visual Studio 2019。编译为 C 代码(/TC 选项)

结果:

IMO 没关系

SSE 实验:

int main()
{
    int sse = _set_SSE2_enable(1);
    double num1, num2, result;
    printf("\nEnter numbers : ");
    scanf("%lf %lf", &num1, &num2);
    result = pow(num1, num2);
    printf("\n SSE = %d, %s %lf\n", sse,  "Result = ", result);
    sse = _set_SSE2_enable(0);
    result = pow(num1, num2);
    printf("\n SSE = %d, %s %lf\n", sse, "Result = ", result);

}

x64 结果:

【讨论】:

  • 那么 VS 2013 或 Win 7 有什么问题吗?假设?
  • 更新软件。 VS 2013是史前版本
  • 最新版 Win 7 !同样,那不是解决方案。事情需要在 Win 7 上运行,否则这很简单。
  • 我没有 Windows 7 和 Visual Studio 2013。那就帮不上忙
  • @pmg 它是 Win OS 特定的代码吗?自从我发布到 Mac、Win 和 Linux 后,我试着远离它,但如果这一切都可以做到……叹息。但真的吗?
【解决方案2】:

这似乎是 VS 2013 编译器的 printf() 实现中的一个错误。

正如@P__J__ 所建议的,我安装了 VS 2019 社区并解决了问题。谢谢,P__J__。

这类问题似乎没有希望了,只能忍气吞声并移至最新的 VS。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多