如何设置实数精度(100分)

  • 主题发起人 主题发起人 seagull
  • 开始时间 开始时间
S

seagull

Unregistered / Unconfirmed
GUEST, unregistred user!
各位先生:
我需要对一些实数类型进行大小判断,精度到1e-10,但两个完全一致的
数字判断出来就不相等,由于算法需要,必须判断,请问有什么好的方法吗?
 
用CurrToStr转成string再比比试试
 
为什么不将两个数相减,如果其差小于某个值(如1e-10)就认为相等。
本来在科学计算中判断相等都是先确定一个误差,只要两数差距不超过这个
值就认为相等。
 
NINGLIU的方法是正解.
 
方栩 的方法错
ningliu 说的等于没回答,你又怎知差小于给定值(如1e-10)的呢?所以也不对
 
procedure TForm1.Button1Click(Sender: TObject);
var
a1, a2, a3:do
uble;
begin
a1 := 1.00000000001;
a2 := 1.0;
a3 := a1 - a2;
if a3 < 0.0000000001 then
begin
application.messagebox('', '<1e-10',0);
end;
end;
试试这个,实在写得太遭了,但能说明问题.
 
先生们:
问题的关键在于我不能确定比较的数值到底是小数点后多少位。
For Example,设比较的数值为1.0000001和1.0000001,如果
我将精度设为1e-7,那么它们就相等了,但如果设为1e-15;就很可
能不相等,如何是好呢?
Please!
 
你不是有精度限制么,一般来说取所要误差精度的小一个数量级的就可以了.
//问题的关键在于我不能确定比较的数值到底是小数点后多少位。
^^^^^^^^^^^^^你必须确定你所要的精度误差,xixi.
在理论上要求相等,但现实世界中不可能完全相等,所以我说,你总的根据你的问题
确定一个合理的误差,或者向用户提出也不错呀.
实在不行就弄个很小的数就得了.
要不将你的实际应用说出来,大伙出出主意.
 
没有别的办法吗?算法中需要判断两点坐标是否重合,由于点的
坐标范围差异较大,如有些是经纬度坐标,精度至少要求1e-10,但设
置这一精度的话,如果点坐标计算出来为1.0000001和1.0000001,以
abs(x1-x2)<1e-10来判断,有时候相等,有些情况就不相等,应该怎
么办呢?都快急死人了。听说C++可以设置实数的精度范围,Delphi
中难道没有吗?
 
C的精度范围是指有效数字,如Real为小数点后的七位有效数字,Double则更多,
在一定的有效数字范围内,可以采用以上的方法。现在你的坐标计算就是随心所欲
地不固定,你让计算机该如何去做?!
 
对不起,我不大清楚有效数字是什么意思,我只是希望如果
计算结果为0.001时,它可以在小数点后面十位再有变化嘛,如
果是0。001000000011111都没有关系的,但不应该是0.00100001
或0.0099999999这样的东西呀,计算机为什么连这也做不到呢?
真是笨死了!
 
计算机本来就没有生命, 当然笨. 它只会执行人的指令. 当初设计浮点数时就是这么定的.
谁叫你不指定精度呢?
 
搞错没有,我前面说过了嘛,要求精度在1e10呀,
怎么说没有精度呢?奇怪!我记得你挺厉害的,你也不
知道吗?拜托,是不是真的没有办法,如果是的话,我
只好死心了。
 
还是没明白您具体的要求.
任何一种浮点数的精度都超过您的要求了. 所以您要进行一下转换, 将原计算结果的精度调整到您
需要的精度, 再进行比较. 最简单的是转成字符串比较.
if formatfloat('0.0000000000', f1)=formatfloat('0.0000000000',f2) then
....
 
抱歉,现在才能看到。不过不是你的意思啦,我的意思是我已经取精度为
1e-10,这样判断起来大部分数值都没有问题,可有时候两个数字明明相等的,
但其相减后值大于1e-10,这样结果就是两数字不等,我的程序就出错了嘛。
有什么好办法吗?
 
喂,喂,有人吗?请回答!
 
这样, 判断是否相等时:
if int(f1*100000000)=int(f2*100000000) then
....
试试.
 
好的,我试试再回答你
 
不会成功. 计算机是二进制的, 你乘的不是2的整次方一样会造成误差(可能更大). 你在1e-10时
得到两个数不相等,那就说明在这个精度下两个数本来就不相等的. 要得到相等的结果只有减小精度,
或者在中间结果时就调整精度再继续下一步运算.
 
除非你用整型,否则就按大家的意思办吧
 
后退
顶部