我用C ++和Pascal编写了函数,给出了第n个Fibbonacci数。正如预期的那样,对于大的n值(n> 92,因为即使f(93)> 2 ^ 63 + 1)我得到的结果也不正确。
但是当我将它们与相同的n进行比较时,我会在两种语言中得到相同的结果。
这与我的想法相反,我会得到一些随机数 我想知道为什么我得到相同的结果以及为什么我首先没有得到整数溢出。
有人可以向我解释一下吗?
代码:
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
long long fibo(int n){
long long a1,a2,pom;
int i=1;
a1 = 0; a2 = 1;
while(i<=n){
pom = a2;
a2 = a1 + a2;
a1 = pom;
i++;
}
return a1;
}
int main(){
int n;
cin >> n;
cout << "Function: "<< setprecision(50) << fibo(n) << endl;
}
Program AddNums(output);
function fibo(n:integer):int64;
var
a1,a2,pom:int64;
i:integer;
begin
a1:=0;a2:=1;i:=1;
while(i<=n)do
begin
pom:= a2;
a2:= a1 + a2;
a1:= pom;
inc(i);
end;
fibo:=a1;
end;
var
n:integer;
begin
readln(n);
writeln(fibo(n));
end.
答案 0 :(得分:7)
undefined 的结果不一定是 random 。当您使用相同的初始条件在同一平台上执行相同的计算时,即使它不正确,您也会得到相同的结果。
在您的情况下,Pascal和C ++程序使用相同的底层硬件,具有相同的int64
和long long
表示,并且它们指示硬件对开始的数字执行相同的数学运算序列相同。因此,它们确实到达相同的数字,代表了这一系列操作的最终结果。
结果仍未定义,因为如果您在不同的平台上运行相同的计算,或者甚至在同一平台上但使用不同的编译器设置,则可能会得到完全不同的错误结果。
答案 1 :(得分:1)
首先它(2 ^ 63 - 1)不是(2 ^ 63 + 1)。
当一个数字溢出时,它会转到已关闭数字中的下一个值&#34;循环&#34;。
假设它从0开始并以8结束,所以如果你的var值是8而你是++那么它将是0。