【发布时间】: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)零,对于 IEEEdoubles 来说非常好。
标签: c windows visual-studio binary windows-7