回 帖 发 新 帖 刷新版面

主题:关于real型小数的精度问题

有这样一个题目用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个回复)

沙发

用双场宽
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.

板凳


谢谢回复。
其实我的原代码中的if语句是无奈之举。该句我最初的代码是:
 if (BC*2+90.5)/3+4)=90.5 then
但pascal的计算该布尔表达式左边怎么也得不出90.5。请问老大,怎样才能使该表达式成立?

3 楼

…………………………
这个题目用循环做……………………好强!!怎么想的

要表达式成立
bc应是84.5
琢磨了一下
有好多矛盾 既然是0.01加的 怎么是84.49000多
我也不明白

4 楼

if (BC*2+90.5)/3+4)=9.05e+1 then

5 楼


类型是是实型,那么在定义场宽时必须用双场宽

既然楼主你是要保留一位小数,那么

writeln(BC:0:1)

当然

writeln(BC:4:1)

也对

这时数字会向右顶格

6 楼

实型都有误差的...(MS EXTENDED除外)
若要判断A=B 须写成A-B<1e-5...YM中

7 楼

{这是一类解方程的题目,如本题的方程为(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

我来回复

您尚未登录,请登录后再回复。点此登录或注册