请教一个关于数据类型的问题

herodazhu 2003-10-18 05:12:37
请问float行的变量可不可以存储比常量FLT_EPSILON更小的数值(正的)啊?
我用一个float的变量x不停的除2,一直可以小到比FLT_EPSILON还小,并且可以保证1+x>1.同样的情况出现在double和long double型上,并且除到最后得到的是相同的一个小值.哪位帮忙解释一下.谢谢:)
...全文
48 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wolf0403 2003-10-19
  • 打赏
  • 举报
回复
1.7E +/- 308 (15 digits)
这是 MSDN 给出的 DOUBLE 的极值。
至于 FLT_EPSILON,看看 MSDN 解释它存在的原因:
Floating-point decimal values generally do not have an exact binary representation. This is a side effect of how the CPU represents floating point data. For this reason, you may experience some loss of precision, and some floating-point operations may produce unexpected results.
。。。
To resolve the behavior, most programmers either ensure that the value is greater or less than what is needed
。。。
These constants (指 FLT_EPSILON 和 DBL_EPSILON )are defined as the smallest positive number x, such that x+1.0 is not equal to 1.0.

也就是说,它不是有意义的最小的值,但是它是有意义的用来进行比较而不会因为精度丢失而被忽略的值。
Wolf0403 2003-10-19
  • 打赏
  • 举报
回复
代码太乱,不加分绝不将就~:P
fifo333 2003-10-19
  • 打赏
  • 举报
回复
up
herodazhu 2003-10-19
  • 打赏
  • 举报
回复
重赏之下必有勇夫(小弟也不宽裕:p)
herodazhu 2003-10-19
  • 打赏
  • 举报
回复
人呢?人呢?明白的战士说句话呀.
herodazhu 2003-10-19
  • 打赏
  • 举报
回复
呵呵,谢谢大家啦,尤其是galaxy_fxstar(阿星)和Wolf0403(完美废人)两位的解释:)明白废人哥哥的意思了!
废人哥你同意星星的观点么?double和float的值怎么会一样呢?
还有啊,怎么给大家加分啊?只是口头表扬一下不好吧,嘿嘿.
我刚来,还不懂规矩,希望大家指点:)
再次谢谢
herodazhu 2003-10-18
  • 打赏
  • 举报
回复
乱了点,将就一下吧:p
herodazhu 2003-10-18
  • 打赏
  • 举报
回复
大家意见好像不统一啊:)
这是代码,看看哪里有毛病吧:(

#include <float.h>
#include <iostream.h>
#include <math.h>


void main(void)
{

float epsilon_flo=0.5;
double epsilon_dou=0.5;
long double epsilon_lon=0.5;

while(1)
{

epsilon_flo=epsilon_flo/2;
//cout<<epsilon_flo<<"\n";

if(epsilon_flo+1<=1)
{

break;
}
}


while(1)
{

epsilon_dou=epsilon_dou/2;
//cout<<epsilon_dou<<"\n";

if(epsilon_dou+1<=1)
{

break;
}
}


while(1)
{

epsilon_lon=epsilon_lon/2;
//cout<<epsilon_lon<<"\n";

if(epsilon_lon+1<=1)
{

break;
}
}

cout<<"epsilon_flo="<<epsilon_flo;

if(epsilon_flo==FLT_EPSILON) cout<<"=";
if(epsilon_flo<FLT_EPSILON) cout<<"<";
if(epsilon_flo>FLT_EPSILON) cout<<">";

cout<<"FLT_EPSILON="<<FLT_EPSILON<<"\n";


cout<<"epsilon_dou="<<epsilon_dou;

if(epsilon_dou==DBL_EPSILON) cout<<"=";
if(epsilon_dou<DBL_EPSILON) cout<<"<";
if(epsilon_dou>DBL_EPSILON) cout<<">";

cout<<"DBL_EPSILON="<<DBL_EPSILON<<"\n";


cout<<"epsilon_lon="<<epsilon_dou;

if(epsilon_lon==LDBL_EPSILON) cout<<"=";
if(epsilon_lon<LDBL_EPSILON) cout<<"<";
if(epsilon_lon>LDBL_EPSILON) cout<<">";

cout<<"LDBL_EPSILON="<<LDBL_EPSILON<<"\n";



}
bapldc 2003-10-18
  • 打赏
  • 举报
回复
我也是一个初学者这个我也不是很清楚
Wolf0403 2003-10-18
  • 打赏
  • 举报
回复
FLT_EPSILON 是一个用来确定两个 float 相等的精确范围值,大概也就是精度限制了。
zhu1981 2003-10-18
  • 打赏
  • 举报
回复
很对不起,
我也是新手,
帮不了你,
抱歉!!!
galaxy_fxstar 2003-10-18
  • 打赏
  • 举报
回复
既然你已经测试到持续除2能得到比FLT_EPSILON小的数,那就证明float可以存储呀!
而且我认为float,double,long double,它们对无穷有限次的左移运算(既除2)的处理方法是一样的,最后都会有一个极限值,且相同!
所以才会出现这样的结果,这只是我的想法,仅供参考!
galaxy_fxstar 2003-10-18
  • 打赏
  • 举报
回复
你的除到最后是什么涵义?最后得到的值完全相等吗??
herodazhu 2003-10-18
  • 打赏
  • 举报
回复
我是新手,好想来错地方了吧:p
不像是基础论坛啊,都是高手啊!!!我只会数据计算等简单程序,别的不太懂啊,帮帮忙啦!!!

64,637

社区成员

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

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