C++Builder中浮点数问题,急!急!急!急!急!(20分)

  • 主题发起人 主题发起人 Fuweng
  • 开始时间 开始时间
F

Fuweng

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:
我突然遇到这样一个问题,
AnsiString a = "0.8";
float b = StrToFloat(a);
我本以为b的值为0.80000000000 ,但得到的是0.80000001192,
不知何故??
 
各位大虾,请快点!!!小弟很急!!!
 
我中午再来
 
计算机运算的问题,你小数位可以取少一些
 
您用的显然是single类型,16位存储,所以精度低一些,
如果要求高精度可以用double,但也会有量化误差
single有效数字7-8位,double15-16位,超过的你只好截尾
 
同意iie!
 
没办法,再长了就不行了。
 
to wjiachun:
在计算中怎样少取一些小数位,就是说在float b = StrToFloat(a);时候怎样让b少取一些小数位?
0.80000000000 同 0.80000001192 相比虽然误差很小,但若经过千万次的累加,其误差就不可小视了!!
to iie:

其实我并不想追求高精度,因为我的程序中只希望b的值精确到小数点后一位,还是那句话:在计算中
怎样少取一些小数位,而不希望在最后显示结果时再截取(如:printf("%10.1f",b)),因为这时误差已经
不小了.但话又说回来,这还是个怎样处理精度的问题.

to all:
这个问题看起来极简单,其实不然!
而且还有个奇怪的现象:
AnsiString Str = "0.8";
float num = StrToFloat(Str);
只有当 Str="0.5" 时, num = 0.5 ,这是我希望得到的.
而其它情况下都有"误差"
Str = "0.1" ;
num = 0.10000000149 ;
Str = "0.2" ;
num = 0.20000000298 ;
Str = "0.9" ;
num = 0.89999997616 ;
...................................

还望大家给小弟出个好主意! 拜托!!
 
怎么没人理我,呜呜呜呜呜呜呜呜呜!
 
对每一个要遇到的数据进行取舍即可。
例如:
num = int(num*10+5)/10;
 
其实,这只是显示时有误差,我想你用的是floattostr()函数,它的参数是Extend型,
系统会将你的single向extend转换,由于字节不同是会产生误差的.这是哪种语言都有的.实际并没有这么大的误差,最多是2进制表示上的误差
 
嗯,delphi中不用single,用double就没有问题,看来真的是显示的问题。
其实,现在提倡用double而不用single。
在cb中,把float改成double看看。
 
》其实我并不想追求高精度,因为我的程序中只希望b的值精确到小数点后一位,
》还是那句话:在计算中怎样少取一些小数位,而不希望在最后显示结果时再截取
》 (如:printf("%10.1f",b)),因为这时误差已经不小了.
其实概率统计书上有差不多的一个例子:
如果采用4舍5入,单个误差服从[0,0.5*最小精度]上的平均分布,所有误差的和
服从正态分布。
所以在计算中你尽管去用最大的精度去计算,最后再截取,此时误差是最小的。
。。。。。证明略
如果追求高精度,请查询:
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=244014
 
Kang的答案最终被接受.
现在分赃 (不好意思,"赃"太少)
Kang : 7 分
wjiachun : 1 分
iie : 3 分
WuWZY : 1 分
SuperMMX : 1 分
philips : 1 分
DreamTiger : 1 分
白马小将 : 5 分
 
多人接受答案了。
 
后退
顶部