在运行pascal时的一个奇怪问题

chenxianwen 2002-07-22 11:34:07
各位大侠,小弟我今天用pascal编了一个程序:
先给ys这个变量赋值为
d[ans[2]]-d[ans[1]]/d2.
结果ys=8.0291970803.
再让 ys=ys-d[ans[2]]-d[ans[1]]/d2.
结果ys<>0.这是为什么?
另:
d[ans[2]]=220;
d[ans[1]]=0;
d2=27.4


另:
急需要用,请给出解决方案。
今天得出的,另给500分;
明天的,另给200分;
后天我就不会结贴给分了。

...全文
40 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ckc 2002-07-22
  • 打赏
  • 举报
回复
d[ans[2]]=220;
d[ans[1]]=0;
不知道d数组是不是整型的,如果是这样的话
可以把它定义成相同的浮点型
或者使用显式的转换成浮点数再与计算
这样应该就没有误差了
ckc 2002-07-22
  • 打赏
  • 举报
回复
浮点运算经常会出类似这样的问题
你的d数组和d2和ys都是相同类型?都是浮点型?
我怀疑是不是因为类型不同,这样在转换时出了点问题
在这种情况下ys即使不为0也是一个很小的数
可以用ys<0.00000001类似的方法
不要直接判断ys是不是为0
chenxianwen 2002-07-22
  • 打赏
  • 举报
回复
哦,说错了。
先给ys这个变量赋值为
(d[ans[2]]-d[ans[1]])/d2.
结果ys=8.0291970803.
再让 ys=ys-(d[ans[2]]-d[ans[1]])/d2.
结果ys<>0.

chenxianwen 2002-07-22
  • 打赏
  • 举报
回复
哦,说错了
ys=(d[ans[2]-d[ans[1])/d2
再让 ys=ys-(d[ans[2]]-d[ans[1]])/d2.
结果ys<>0.

各位,帮帮忙啊!
chenxianwen 2002-07-22
  • 打赏
  • 举报
回复
谢谢火。
我已经把分发给你了。
你看看有没有发到。
ckc 2002-07-22
  • 打赏
  • 举报
回复
2进制表示浮点数,如果小数部分不是2的负整数次方或者2的负整数次方的和的话,一定会有误差的
比如0.5,0.75,0.125这样的小数表示成二进制浮点数没有误差
象0.1,0.2,0.3,0.4这样的小数表示成二进制浮点数是一定会有误差的
所以浮点计算的误差经常是不可避免的
这个问题一般程序设计的基础教材中都会有说到
也正因为这个,判断浮点数是否为一个特定值一定要小心
这也是为什么一般不用浮点数做for的循环变量的原因
zzwu 2002-07-22
  • 打赏
  • 举报
回复
我用下面的程序试验,结果ys为严格的0:

var ys,d2:real;
d:array[1..2] of real;
begin
d[2]:=220;
d[1]:=0;
d2:=27.4;
ys:=d[2]-d[1]/d2;
ys:=ys-d[2]-d[1]/d2;
writeln(ys);
end.
chenxianwen 2002-07-22
  • 打赏
  • 举报
回复
const
m=100;
var
d:array[1..m]of real;
ans:array[1..m]of integer;

不过火说得对,它的确是一个非常小的数。
可是为什么呢,都是浮点型的呀,为什么还会有这样的误差呢?

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧