从c和fortran代码转为Pascal,为什么结果会不一样?问题出在那里? (50分)

L

linsb

Unregistered / Unconfirmed
GUEST, unregistred user!
#include "stdio.h"
#include "mrnd1.c"
main()
{ int i;
do
uble r;
r=5.0;
printf("/n");
for (i=0;
i<=9;
i++)
printf("%10.7lf/n",mrnd1(&amp;r));
printf("/n");
}
//产生0-1之间的随机数(浮点)
do
uble mrnd1(r)
do
uble *r;
{ int m;
do
uble s,u,v,p;
s=65536.0;
u=2053.0;
v=13849.0;
m=(int)(*r/s);
*r=*r-m*s;
*r=u*(*r)+v;
m=(int)(*r/s);
*r=*r-m*s;
p=*r/s;
return(p);
}
fortran:
REAL FUNCTION NRND1(R)
DOUBLE PRECISION S,U,V,R
S=65536.0
U=2053.0
V=13849.0
M=R/S
R=R-M*S
R=U*R+V
M=R/S
R=R-M*S
NRND1=R/S
RETURN
END
 
B

BeginDelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
program Main;
var I:Integer;
R:Double;
begin
r:=5.0;
writeln;
for I:= 0 to 8do
write(Format("%10.7lf/n",[mrnd1(r)]));
writeln;
end;

function mrnd1(const r:Double):Double;
var m:Integer;
s,u,v,p:Double;
begin
s:=65536.0;
u:=2053.0;
v:=13849.0;
m:=Round(r/s);
r:=r-m*s;
r:=u*r+v;
m:=Round(r/s);
r:=r-m*s;
p:=r/s;
Result:=P;
end;


 
B

bill_max

Unregistered / Unconfirmed
GUEST, unregistred user!
快给上面那位加分吧:)
 
L

linsb

Unregistered / Unconfirmed
GUEST, unregistred user!
感谢回答!
我关心的主要是:
产生0-1之间的随机数(浮点)。
begin
Delphi给出的代码是否可运行?
function mrnd1(const r:Double):Double;//有错!
如果改为:
function mrnd1( r:Double):Double;或
function mrnd1(var r:Double):Double;
结果均不对(应该不同的产生0-1之间的随机数),该函数用了指针!
 
B

BeginDelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
呵呵!写成const是一时疏忽,应该是var.
mrnd1是一个比较常见的0~1均匀分布的随机数生成函数。我想你是看的比较老的书吧,
还用的是K&amp;R C中的写法。
我觉得我写的是对的,但是你的主程序没有写对吧。
你试试这个呢:
for I:=0 to 100
begin
b:=I;
Writeln(rmnd1(b));
end;
 
L

linsb

Unregistered / Unconfirmed
GUEST, unregistred user!
程序没错!我在turbo c下运行过,结果为:
0.3979504
0.6135712
0.8729248
0.3259430
....
 
B

BeginDelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
等我一会儿!我发现是我的程序有错!
我再调试一下,Sorry
 
B

BeginDelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
program TestRnd;
{$J+}
function Rnd01(var R:Integer):Double;
const
S:Integer=65536;
U:Integer=2053;
V:Integer=13849;
begin
R:=R mod S;
R:=U*R+V;
R:= R mod S;
Result:=R/S;
end;

var
R:Integer;
I:Integer;
begin
R:=5;
for I:=0 to 9do
begin
Writeln(Rnd01(R));
end;
end.

呵呵!功能是一样的,但和C的程序可能有一点点差别。
 
L

linsb

Unregistered / Unconfirmed
GUEST, unregistred user!
该函数用在:
求非线性方程组一组实根的蒙待卡洛法中被调用-c语言程序,
调用参数是浮点数。还得麻烦你。
为什么在c中可以,而改为delphi就不行?
不知fortran熟不?fortran的代码我也有。
 
B

BeginDelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
呵呵!所以我说这个方法经典呀。我的程序就是根据一个Fortran的程序改过来的。
我就不懂为什么改成Pascal后会有负数。我还要多试试再说。
 
D

DarwinZhang

Unregistered / Unconfirmed
GUEST, unregistred user!
看样子这个程序比较老,他们的整数应该是smallint即16位的.
另外,我用windows的计算器进行运算,
第一次结果应该是0.367950439453125,和delphi的运算结果一致,
而不是linsb的0.3979504
我手头没有turboC或fortran无法深入试验.
 
L

linsb

Unregistered / Unconfirmed
GUEST, unregistred user!
谢谢DarwinZhang,参与,至今没有找到合理解释--如题。
 
L

LiChaoHui

Unregistered / Unconfirmed
GUEST, unregistred user!
VC中的运行结果呢?
 
L

LiChaoHui

Unregistered / Unconfirmed
GUEST, unregistred user!
我调试了一下,我不明白begin
Delphi的程序中取整为什么要用Round
我将其改为Trunc
运行结果完全一致,
begin
Delphi,怎么犯了低级错误呢
明明是取整,而非舍入操作
我调试了一下,我不明白begin
Delphi的程序中取整为什么要用Round
我将其改为Trunc
运行结果完全一致,
begin
Delphi,怎么犯了低级错误呢
明明是取整,而非舍入操作
program Main;
{$apptype console}
uses
SysUtils;
var I:Integer;
R:Double;
function mrnd1(var r:Double):Double;
var m:Integer;
s,u,v,p:Double;
begin
s:=65536.0;
u:=2053.0;
v:=13849.0;
m:=Trunc(r/s);
r := r-m*s;
r:=u*r+v;
m:=Trunc(r/s);
r:=r-m*s;
p:=r/s;
Result:=P;
end;

begin
r:=5.0;
writeln;
for I:= 0 to 9do
writeln(Format('%10.7f',[mrnd1(r)]));
writeln;
readln;
end.

 
L

linsb

Unregistered / Unconfirmed
GUEST, unregistred user!
谢谢各位参与,分不多,是个意思。
 

Similar threads

I
回复
0
查看
718
import
I
I
回复
0
查看
562
import
I
I
回复
0
查看
698
import
I
回复
33
查看
2K
冰力不足
顶部