在C语言 0.10000 >= 0.1这个表达式的值是啥

blueink_200451 2009-06-24 03:36:00
在C语言 0.10000 >= 0.1这个表达式的值是啥
我这里跑出来结果是false.

我的编译器是:
gcc (GCC) 4.1.1 20070105 (Asianux 3.0 4.1.1-52.2.1)
Copyright (C) 2006 Free Software Foundation, Inc.

VC下跑出来应该都是true。

大家看看。为什么这样?高手给出个主意。谢谢。
...全文
139 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
SpiritedAway 2010-08-15
  • 打赏
  • 举报
回复
看了这个释怀了我心中很多困惑~~~~
xianzi123 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 Walf_ghoul 的回复:]
引用 8 楼 hikaliv 的回复:
浮点数只能进行范围判断,不能进行精确比较。这是浮点数操作和整型数操作的一大区别之一。
[/Quote]

确实学习了...
以前从没注意过
Walf_ghoul 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hikaliv 的回复:]
浮点数只能进行范围判断,不能进行精确比较。这是浮点数操作和整型数操作的一大区别之一。
[/Quote]
学习了。。。
Cheester 2009-06-24
  • 打赏
  • 举报
回复
不懂。。。
rejoice914 2009-06-24
  • 打赏
  • 举报
回复
float、double 型的比较大小尽量要用一个范围的!
参考下面:

4.3.3 浮点变量与零值比较

l 【规则4-3-3】不可将浮点变量用“==”或“!=”与任何数字比较。

千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。

假设浮点变量的名字为x,应当将

if (x == 0.0) // 隐含错误的比较

转化为

if ((x>=-EPSINON) && (x<=EPSINON))

其中EPSINON是允许的误差(即精度)。

光宇广贞 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hairetz 的回复:]
C/C++ code
void main()
{

bool a=(0.10000 >= 0.1);
if(a)
cout<<"ok"<<endl;
}





我在Vc6测了是ok的。

不知道gcc怎么会这样。
你可以转换一下看看
(double)0.10000 >= (double)0.1
[/Quote]

常数 0.10000 和 0.1 不就是 double 型的么……
  • 打赏
  • 举报
回复

void main()
{

bool a=(0.10000 >= 0.1);
if(a)
cout<<"ok"<<endl;
}



我在Vc6测了是ok的。

不知道gcc怎么会这样。
你可以转换一下看看
(double)0.10000 >= (double)0.1
genguyige 2009-06-24
  • 打赏
  • 举报
回复
好奇怪啊 呵呵 这些东西以前都没有碰到过耶
kernxn 2009-06-24
  • 打赏
  • 举报
回复
vc++6.0
#include<stdio.h>
#include<string.h>
main()
{
int i;
i=0.10000>=0.1;
printf("%d\n",i);
}


结果为1;
光宇广贞 2009-06-24
  • 打赏
  • 举报
回复
如 9 楼所述,你就算


int fuck = (int)ceiling ( pow ( 1000, 1.0 / 3 ) );


结果一样是 9
光宇广贞 2009-06-24
  • 打赏
  • 举报
回复
而且楼主可以回去试试,

你知道给 1000 开三次方的结果是 10 对吧……

你算算这个:


#include<math.h>
#include <stdio.h>
#include <windows.h>

int main()
{
int fuck = (int) pow ( 1000, 1.0 / 3 );

printf ( "%d\n", fuck );

system( "pause" );
return 0;
}


我告诉你,结果是 9
光宇广贞 2009-06-24
  • 打赏
  • 举报
回复
浮点数只能进行范围判断,不能进行精确比较。这是浮点数操作和整型数操作的一大区别之一。
老邓 2009-06-24
  • 打赏
  • 举报
回复
根本就不应该对浮点数比大小!
会出现不确定结果的。
lingyin55 2009-06-24
  • 打赏
  • 举报
回复
不要对浮点数用大于或小于。
这种跟精度相关的东西,结果并不确定。
kingcard 2009-06-24
  • 打赏
  • 举报
回复
衷告楼主,搞这些东西(比较浮点数)没啥意义,类似于编译器的语法糖,可能每种编译器的结果都不一定相同,与编译器的实现、CPU浮点寄存器、浮点运算指令相关。在现实生活的各种C/C++大型、中型项目中,绝对没有这种没意义的代码,建议你还是多研究点有意义的东西。
Yhzhtk 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 w0911h 的回复:]
应该跟浮点数表示精度有关,0.10000在内存中可能是0.099999之类的很接近的数,这样就可能出现你说的情况,浮点数尽量避免这样的直接比较
[/Quote]
对 浮点数也一般都不能表示很接近零的数 其范围与浮点数所占字节数的大小有关
其表达的数在精度超过其范围是时候都是一段一段不连续的
如0.99999999999999过了就是1.000000000000了 其后不能再加上9呢 也就是说溢出了
过了看看二进制的有关内容你就懂了
机智的呆呆 2009-06-24
  • 打赏
  • 举报
回复

#include<iostream>
using namespace std;

int main()
{
double i=0.10000;
double j=0.1;
cout.precision(50);
cout<<i<<endl;
cout<<j<<endl;
system("pause");
}
至善者善之敌 2009-06-24
  • 打赏
  • 举报
回复
GCC系统是大端模式还是小端模式?
w0911h 2009-06-24
  • 打赏
  • 举报
回复
应该跟浮点数表示精度有关,0.10000在内存中可能是0.099999之类的很接近的数,这样就可能出现你说的情况,浮点数尽量避免这样的直接比较

69,373

社区成员

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

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