精度问题是怎么回事啊?

var q,p:real;

n,l:longint;

begin

readln(p,q);

for n:=1 to 1000000000 do

begin

l:=trunc(n*q/100)-trunc(n*p/100);

case l of

0:continue;

1:if trunc(n*p/100)=n*p/100 then continue

else begin writeln(n); halt; end;

2:if trunc(n*p/100)=n*p/100 then begin writeln(n); halt; end

else continue;

else continue;

end;

end;

end.

3,6数据过不去

1 条评论

  • @ 2009-09-19 19:46:23

    计算机也有极限,real数据类型有效范围

    在计算机中,由于十进制与二进制之间得差异导致某些数在十进制时是容易表示的,但在二进制时却不同,如0.5,二进制似乎是无法完全表示的。

    还有就是real 可以表示11到12位有效数字,一旦超过有效位数,就很难确定为零了,但可以界定一个标准,如定小于0.000001 (10^-6)的为零,应该可以过了。

    可以自己打代码测试,如

    const zero=0;

    var i:real;

    begin

    i:=0.0000000006*0.0000006;//精度出错

    i:=i-0.0000000006*0.0000006;

    if i=zero then writeln('zero')

    else writeln('not zero');

    end.

    结果是:not zero

    改为如下就可以了

    const zeo=0.000001;

    var i:real;

    begin

    i:=0.0000000006*0.0000006;

    i:=i-0.0000000006*0.0000006;

    if i

  • 1

信息

ID
1041
难度
6
分类
其他 | 数学 点击显示
标签
(无)
递交数
8246
已通过
2314
通过率
28%
被复制
11
上传者