!!!如何识别出浮点数-0.000000 ,请帮忙!!!

MPU 2003-11-02 06:56:31
!!!如何识别出浮点数-0.000000 ,请帮忙!!!

写单纯形法程序时,出现-0.000000.

比如:
float a = 5.000,a2 = 2.600,b = -13.000;
float c = b + a * a2; //这时 c为 -0.000000
printf("%f\n",c);

如何识别c为-0.000,或者当c为-0.000000 时c = 0.

谢谢!!!!!
...全文
162 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaoxinyan 2003-11-06
  • 打赏
  • 举报
回复
我有X86,也有Ultra SPARC,但关键是“你在用x86”就行了。
支持C99的编译器,GCC就是一个,但还不是完全支持,尤其是C99的库不是一天两天就能写好的。其他的商业产品也有,例如:
www.comeaucomputing.com(编译器)
www.dinkumware.com(库)
C99增加的这些数学函数、宏暂时未反映在C++标准中(C++是1998出的标准),但这不妨碍你正常使用啊,任何一本C++教科书都会教你如何在C++里调用C函数。
yaoxinyan 2003-11-05
  • 打赏
  • 举报
回复
真不好意思,写错了,signbit是C99才提供的。所以你的VC6没有。
不过,你用VC6证明你的机器是i386,这也好办,自己写一个函数判断就行啦!

union real
{
int p[2];
double d;
};

int mySignbit(double x)
{
union real r;
r.d = x;
r.p[1] &= 0x8000;
return r.p[1];
}
MPU 2003-11-05
  • 打赏
  • 举报
回复
谢谢!

用了可以..

难道你用的不是80X86 CPU吗,是SUN的服务器吗?

请问支持C99的编译器,在哪有下的.

Dev-C++行吗, 要用gcc吗?

C99中这东东与C++标准兼容吗?

也许我问得比较多,麻烦一下了... ^_^
MPU 2003-11-04
  • 打赏
  • 举报
回复
VC++ 6中没有啊!

STLport也没有
yaoxinyan 2003-11-03
  • 打赏
  • 举报
回复
在<math.h>中有:
int signbit(double x);
如果x的符号位置“1”(这意味着浮点数为负),则signbit返回非零值;
如果x的符号位是零(这意味着浮点数为正),则返回零。
x可以是所有的浮点数,包括INFs,ZEROs,NANs。你可以放心地用它判别出负零。

并且,signbit属于C89、C99的标准库,不用担心可移植问题。
cxjddd 2003-11-03
  • 打赏
  • 举报
回复
我看这个没有办法吧,呵呵,
-0.000000 在机器里表示,就是 0.000000,
你只有通过计算的过程来判断它,
MPU 2003-11-03
  • 打赏
  • 举报
回复
cfpp1234 2003-11-02
  • 打赏
  • 举报
回复
You can written a fuzz function
ie.
bool fuzz(const double& value,const double& compare, const double& fz) {
return (value >= compare-fz && value <= compare+fz) ;
}

c = fuzz(c,0.0,1e-8) ? 0.0 : c ; // fuzz in -0.0000001 <-> 0.00000001
or
c = fuzz(c,100.0,1e-8) ? 100.0 : c ; // fuzz in 99.9999999 <-> 100.0000001
luckyum 2003-11-02
  • 打赏
  • 举报
回复
如果是 c=a/b的话可以用如下。
if(fabs(c)<1e-8)
{
}
向你这样的乘法,就不太清楚了。进行类型转化double不行吗/不太明白你的意思。
MPU 2003-11-02
  • 打赏
  • 举报
回复
我写单纯形法求解时,用高斯消元,程序要识别出下列:
-0.000
-0.000
1.000
-0.000

0.000
0.000
1.000
0.000

他们是实际上一样的....
smalltalk 2003-11-02
  • 打赏
  • 举报
回复
浮点数的精确判断十分困难,但在一定的精度范围比较是简单的。
我已经写出这个函数给你参考了。
/*********************************************************
* Compare two float with precise *
* return value > 0, float one > float two *
* return value = 0, float one = float two *
* return value < 0, float one < float two *
*********************************************************/
int cmpFloat(float one, float two, unsigned int precise)
{
#define MAXFLOATLENGTHINDEC 128
char buffer1[MAXFLOATLENGTHINDEC];
char buffer2[MAXFLOATLENGTHINDEC];

if ( (one > 0.0) && (two > 0.0) )
{
sprintf(buffer1, "%f", one)
sprintf(buffer2, "%f", two)
return strncmp(buffer1, buffer2, precise);
}
else if ( (one < 0.0) && (two < 0.0) )
{
sprintf(buffer1, "%f", one)
sprintf(buffer2, "%f", two)
int ret = strncmp(buffer1, buffer2, precise);
if (ret == 0)
return 0;
else if (ret > 0)
return -1;
else if (ret < 0)
return 1;
}
else if ( (one > 0.0) && (two < 0.0) )
{
return 1;
}
else if ( (one < 0.0) && (two > 0.0) )
{
return -1;
}
else
return 0;//impossible.
}

zhuixe 2003-11-02
  • 打赏
  • 举报
回复
if(fabs(c)<0.0000000000000001)
{
}
yongming520 2003-11-02
  • 打赏
  • 举报
回复
有点不明白楼主的意思,用一个sizeof()若是2 和4 再讨论
showming 2003-11-02
  • 打赏
  • 举报
回复
期待!

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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