求助:浮点数精度问题.

科比布莱恩特 2010-01-15 03:48:34
VARIANT testvar;
testvar.vt = VT_R4;
for (testvar.fltVal = 0.00;testvar.fltVal <= 17.00; testvar.fltVal+=0.10)
{
m_Gls_ActiveX.SetAttrib(COleVariant("hehe"),testvar);
}


以上是我做一个数值向上走的浮点数运算.

当testvar.fltVal <= 2.50时,没有问题.

但当testvar.fltVal <= 17.00时,会无故少0.10.

经检查是浮点数在数值运算很大时,会无故减少0.10,请问怎样解决?
...全文
85 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
科比布莱恩特 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sweetjian 的回复:]
C/C++ code
VARIANT testvar;
testvar.vt= VT_R4;for (testvar.fltVal=0;testvar.fltVal<=170; testvar.fltVal+=1)
{
testvar.fltVal/=10;
m_Gls_ActiveX.SetAttrib(COleVariant("hehe"),testvar);
testvar.fltVal*=10;
}
这样可以了吗
[/Quote]

OK了,散分.
sweetjian 2010-01-15
  • 打赏
  • 举报
回复

VARIANT testvar;
testvar.vt = VT_R4;
for (testvar.fltVal = 0;testvar.fltVal <= 170; testvar.fltVal+=1)
{
testvar.fltVal/=10;
m_Gls_ActiveX.SetAttrib(COleVariant("hehe"),testvar);
testvar.fltVal*=10;
}

这样可以了吗
liru125504 2010-01-15
  • 打赏
  • 举报
回复
c中float精度问题
float存储格式为:
S E M
1位符号位 8位指数 23位尾数

转成数值即为:V=(-1)^S * 1.M * 2^(E-127)

对于16.5转成二进制为00010000.1==>1.00001*2^4,
那么在内存的表示为:
符号位 指数4+127 = 131 尾数
0 10000011 00001 000000000000000000

在转换过程中由于需要往右移位, 可见对于float数整数部分越大,小数部分的精度就越低
对float数来说有效数字约为7位(2^23约等于10^7),所以整数部分占的位数越多,小数部分
的精度就越低,当整数部分超过9999999后小数部分已经完全无精度了
科比布莱恩特 2010-01-15
  • 打赏
  • 举报
回复
VT_R4 [V][T][P][S] 4 byte real
科比布莱恩特 2010-01-15
  • 打赏
  • 举报
回复
我真实的应该是要得到17.00,但现在得到的是16.90.
科比布莱恩特 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sagegz 的回复:]
换成int,都*100
[/Quote]

请问这位兄弟,怎样操作?
hai040 2010-01-15
  • 打赏
  • 举报
回复
浮点别用==
写成<17.01之类的
sagegz 2010-01-15
  • 打赏
  • 举报
回复
换成int,都*100

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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