主题:关于real型小数的精度问题
gebowangzm
[专家分:480] 发布于 2008-12-08 20:53:00
有这样一个题目用pascal编程计算:
甲、乙、丙三个学生考试,甲考了90.5分,已知甲的分数比他们三人的平均分多4分,求乙和丙的平均分。
我的源码是:
program mytest;
var BC:real;{乙和丙的平均分}
begin
BC:=0;
while BC<=100 do
begin
if abs((BC*2+90.5)/3+4-90.5)<0.001 then
begin
writeln(BC);
break;
end;
BC:=BC+0.01;
end;
readln;
end.
运行结果是84.49000006。 [color=FF0000]请问怎样才能让程序打印84.5?[/color]
回复列表 (共7个回复)
沙发
小地小地 [专家分:300] 发布于 2008-12-10 19:25:00
用双场宽
program mytest;
var BC:real;{乙和丙的平均分}
begin
BC:=0;
while BC<=100 do
begin
if abs((BC*2+90.5)/3+4-90.5)<0.001 then
begin
writeln(BC:4:1);{这里4表示占的格子数,1表示小数位数.lz的书上没有吗}
break;
end;
BC:=BC+0.01;
end;
readln;
end.
板凳
gebowangzm [专家分:480] 发布于 2008-12-10 21:11:00
谢谢回复。
其实我的原代码中的if语句是无奈之举。该句我最初的代码是:
if (BC*2+90.5)/3+4)=90.5 then
但pascal的计算该布尔表达式左边怎么也得不出90.5。请问老大,怎样才能使该表达式成立?
3 楼
小地小地 [专家分:300] 发布于 2008-12-11 20:06:00
…………………………
这个题目用循环做……………………好强!!怎么想的
要表达式成立
bc应是84.5
琢磨了一下
有好多矛盾 既然是0.01加的 怎么是84.49000多
我也不明白
4 楼
pupu [专家分:50] 发布于 2009-01-16 12:20:00
if (BC*2+90.5)/3+4)=9.05e+1 then
5 楼
jyz8125226 [专家分:50] 发布于 2009-01-24 23:00:00
类型是是实型,那么在定义场宽时必须用双场宽
既然楼主你是要保留一位小数,那么
writeln(BC:0:1)
当然
writeln(BC:4:1)
也对
这时数字会向右顶格
6 楼
abcwuhang [专家分:1840] 发布于 2009-01-31 15:20:00
实型都有误差的...(MS EXTENDED除外)
若要判断A=B 须写成A-B<1e-5...YM中
7 楼
lixeb [专家分:80] 发布于 2009-02-22 20:21:00
{这是一类解方程的题目,如本题的方程为(90.5+2*X)/3+4-90.5=0}
var i,j:integer;
procedure Lixeb;{效率要高与MyTest}
var a,b,r,e:real;
Function fc(x:real):real;{要解的方程}
begin
fc:=(90.5+2*X)/3+4-90.5;
end;
begin
a:=0; b:=100; {方程解的取值范围a<=X<=b}
r:=(a+b)/2;
e:=0.01; {方程解的解的精度要求,e=0.01表示精确到0.1,以此类推}
i:=0;
while(abs(a-b)>e)do
begin
inc(i);
if(fc(a)*fc(r)>=0)then begin a:=r; end
else b:=r;
r:=(a+b)/2;
end;
writeln('Lixeb: Result=',r:1:1);
end;
procedure mytest;
var BC:real;{乙和丙的平均分}
begin
BC:=0;
j:=0;
while BC<=100 do
begin
inc(j);
if abs((BC*2+90.5)/3+4-90.5)<0.001 then
begin
writeln('MyTest: Result=',BC:1:1);
break;
end;
BC:=BC+0.01;
end;
end;
begin
i:=0;
j:=0;
Lixeb;
MyTest;
writeln('Lixeb的循环次数为:',i);
writeln('MyTest的循环次数为:',j);
readln;
end.
输出结果:
Lixeb: Result=84.5
MyTest: Result=84.5
Lixeb的循环次数为:14
MyTest的循环次数为:8451
我来回复