C++ 精度问题!恼人!

li4951 2011-09-14 10:37:29
middle = 6;
tempSum = 0.5 + 1.0 / 3;
请问1.0 / middle + tempSum >= 1.0
为真还是假?
请自己实践然后解释原因?????估计是精度问题。烦请详细解释。
...全文
337 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhufeiguanghui1 2011-09-16
  • 打赏
  • 举报
回复
ding
mathe 2011-09-16
  • 打赏
  • 举报
回复
通常情况,浮点问题必然有精度问题,没有办法。
不过具体到本题,如果能够将所有数乘上6(也就是通常说的量化),就变成整数间比较问题了,就可以解决问题了
kissthefuture 2011-09-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhao4zhong1 的回复:]

用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)
同理,用二进制小数也不能精确表示某些10进制小数。
C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\float.h
C/C++ code
...
#define DBL_DIG 15 ……
[/Quote]

说得太好了
ljhhh0123 2011-09-16
  • 打赏
  • 举报
回复
浮点环境是可以控制舍入的.

记得浮点本身就是不精确的.

a*b 不一定等于 b*a
turing-complete 2011-09-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 li4951 的回复:]

除了高精度,有没有有效地解决办法?
[/Quote]

你在实际设计程序的时候,遇到了这样的问题?
li4951 2011-09-16
  • 打赏
  • 举报
回复
除了高精度,有没有有效地解决办法?
赵4老师 2011-09-14
  • 打赏
  • 举报
回复
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)
同理,用二进制小数也不能精确表示某些10进制小数。
C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\float.h
...
#define DBL_DIG 15 /* # of decimal digits of precision */
#define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
#define DBL_MANT_DIG 53 /* # of bits in mantissa */
#define DBL_MAX 1.7976931348623158e+308 /* max value */
#define DBL_MAX_10_EXP 308 /* max decimal exponent */
#define DBL_MAX_EXP 1024 /* max binary exponent */
#define DBL_MIN 2.2250738585072014e-308 /* min positive value */
#define DBL_MIN_10_EXP (-307) /* min decimal exponent */
#define DBL_MIN_EXP (-1021) /* min binary exponent */
#define _DBL_RADIX 2 /* exponent radix */
#define _DBL_ROUNDS 1 /* addition rounding: near */

#define FLT_DIG 6 /* # of decimal digits of precision */
#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define FLT_GUARD 0
#define FLT_MANT_DIG 24 /* # of bits in mantissa */
#define FLT_MAX 3.402823466e+38F /* max value */
#define FLT_MAX_10_EXP 38 /* max decimal exponent */
#define FLT_MAX_EXP 128 /* max binary exponent */
#define FLT_MIN 1.175494351e-38F /* min positive value */
#define FLT_MIN_10_EXP (-37) /* min decimal exponent */
#define FLT_MIN_EXP (-125) /* min binary exponent */
#define FLT_NORMALIZE 0
#define FLT_RADIX 2 /* exponent radix */
#define FLT_ROUNDS 1 /* addition rounding: near */
...
wchyumo2009 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xunxun1982 的回复:]
浮点数一般不这样和真值比较
一般都是比较一个范围

想确定比较,请全都放大倍数转化成整型,再比较

或者使用高精度算法
[/Quote]
精度问题
luciferisnotsatan 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xunxun1982 的回复:]

浮点数一般不这样和真值比较
一般都是比较一个范围

想确定比较,请全都放大倍数转化成整型,再比较

或者使用高精度算法
[/Quote]
++
lxp_1988 2011-09-14
  • 打赏
  • 举报
回复
我是看的别个的 不晓得 对lz 有帮助没:

这个并不是编译器奇怪,而是标准如此要求:
An unsuffixed floating constant has type double. If suffixed by the letter f or F, it has
type float. If suffixed by the letter l or L, it has type long double.

对于比较操作(以下说法全部基于IA32和IA32上的常见编译器,并且不使用例如MMX、SSE之类的扩展特性),如果是在float变量和加上f作为后缀的常量之间进行的话,那么比较动作并不牵涉FPU,一般的编译器直接使用通用寄存器来完成比较操作,但是一旦牵扯到了double,那么就会使用FPU来完成比较,用fld加载比较操作的操作数到FPU的寄存器栈,然后执行浮点比较指令,完成比较。

由此,如果你在float变量里面保存了float变量无法精确保存的值,然后再和double比较的话,由于内部表示的不一致,所以最终得到的结果显然是假而不是真。

你可以看一下这个例子,这个时候得到的是真,因为内部表示是一致的:
float val = 1.0;
(val == 1.0) && printf( "val == 1.0\n ");
xunxun 2011-09-14
  • 打赏
  • 举报
回复
浮点数一般不这样和真值比较
一般都是比较一个范围

想确定比较,请全都放大倍数转化成整型,再比较

或者使用高精度算法
niannian_315 2011-09-14
  • 打赏
  • 举报
回复
是真的。
turing-complete 2011-09-14
  • 打赏
  • 举报
回复
没什么好解释的,是精度问题
AndyZhang 2011-09-14
  • 打赏
  • 举报
回复
这个也没办法啊,除非你模拟分数运算,计算机毕竟是机器

65,207

社区成员

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

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