boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 浮点数运算等于0的问题
相关主题
一般来说浮点数乘法和除法哪个快?
【急】JS round 运算出错如何破
[合集] 关于浮点数计算和underflow
有没有啥package可以统计程序的浮点运算量的?
问一个C语言中整型和浮点运算的问题 (转载)
请问如何能让Qt(C++)中的浮点运算尽可能精确?
一个dot net浮点运算的问题
print double auto precision?
如何避免round off error
binary number question
相关话题的讨论汇总
话题: 浮点数话题: 优化话题: 等于话题: 浮点话题: fn
进入Programming版参与讨论
1 (共1页)
s*****k
发帖数: 604
1
碰到一个非常困惑的问题
比如有一个浮点正数数组a[],
然后我通过一个for循环找到这个数组里面最小的数,
赋值为b,
然后for循环把a里每个数都减去这个b,
得到新的a.
那么这a[]里面一定有一个为0.0
我用 a[i]==0.0 来找这个index i,
发现有时候找不到,原来有时候减完b后
的a[]本来应该为0.0的那个数是一个非常小的数,而不等于0.0
请问有经验的人说说这个是我的程序出错呢,
还是新的那个a[]里最小的那个数有可能不等于0
浮点数运算难道 会有 a-a 不等于0的情况吗?
b****j
发帖数: 78
2
应该没有问题,a - a应该是0
除非你b和a的类型不一致,或者中间又做了其他运算

【在 s*****k 的大作中提到】
: 碰到一个非常困惑的问题
: 比如有一个浮点正数数组a[],
: 然后我通过一个for循环找到这个数组里面最小的数,
: 赋值为b,
: 然后for循环把a里每个数都减去这个b,
: 得到新的a.
: 那么这a[]里面一定有一个为0.0
: 我用 a[i]==0.0 来找这个index i,
: 发现有时候找不到,原来有时候减完b后
: 的a[]本来应该为0.0的那个数是一个非常小的数,而不等于0.0

z****e
发帖数: 2024
3
if( abs(a-b) < numeric_limits::epsilon() );
or
if( abs(a-b) < c*numeric_limits::epsilon() );//c=2,5,10.etc,....
U********d
发帖数: 577
4
浮点判零是一个经典问题啊,一定不能a==0.0,应该用类似于if(a<10e-20 && a>-10e-
20)的条件判断。
至于原因嘛……嘿嘿,不说。
a******d
发帖数: 191
5
assuming fn is the min of f[0-m], then fn-fn=0, and others fi - fn >= 0. I
don't see why the n'th subtraction isn't 0.
paste your code to investigage
f*****Q
发帖数: 1912
6
浮点运算还真有可能。

【在 s*****k 的大作中提到】
: 碰到一个非常困惑的问题
: 比如有一个浮点正数数组a[],
: 然后我通过一个for循环找到这个数组里面最小的数,
: 赋值为b,
: 然后for循环把a里每个数都减去这个b,
: 得到新的a.
: 那么这a[]里面一定有一个为0.0
: 我用 a[i]==0.0 来找这个index i,
: 发现有时候找不到,原来有时候减完b后
: 的a[]本来应该为0.0的那个数是一个非常小的数,而不等于0.0

O*******d
发帖数: 20343
7
浮点数计算结果判断,不要用==。 一般用一个小范围来判断。两个相同值的浮点数相
加,和同一个值的浮点数乘以2,结果一般不会一样的。 就是a + a一般不等于 a * 2.
0, 但结果非常接近。 a - a不一定是0,但非常接近0。 我以前用过一个compiler,
写的程序运行结果预期是0的,变成一个几千次方的极大数。原因是指数部分从极负变
成极正。 类似例子是8bit的整数减法,-127 - 1 == 128.
o**o
发帖数: 3964
8
a - a 应该是等于 0 的。前面有位说的对,中间有其他过程。
M***0
发帖数: 1180
9
刚做了实验,明明是0
s*****k
发帖数: 604
10
代码其实挺复杂的,
我只是把问题抽象出来说了。
其实我自己另外写了一段简单的代码,
减完后的a[]里最小值是等于0.0的
我原来的代码其实结果总是合理的,
只是我觉得可能隐藏着错误

I

【在 a******d 的大作中提到】
: assuming fn is the min of f[0-m], then fn-fn=0, and others fi - fn >= 0. I
: don't see why the n'th subtraction isn't 0.
: paste your code to investigage

相关主题
有没有啥package可以统计程序的浮点运算量的?
问一个C语言中整型和浮点运算的问题 (转载)
请问如何能让Qt(C++)中的浮点运算尽可能精确?
一个dot net浮点运算的问题
进入Programming版参与讨论
s*****k
发帖数: 604
11
我用的是cygwin 里面的 gcc 3.4.4
现在发现只要把 -Ox 的优化参数去掉,
就可以用 a[i]==0.0
加上优化选项出来的a[i]最小的那个数是个量级是
10^-15 到 10^-18 的一个很小的数

2.

【在 O*******d 的大作中提到】
: 浮点数计算结果判断,不要用==。 一般用一个小范围来判断。两个相同值的浮点数相
: 加,和同一个值的浮点数乘以2,结果一般不会一样的。 就是a + a一般不等于 a * 2.
: 0, 但结果非常接近。 a - a不一定是0,但非常接近0。 我以前用过一个compiler,
: 写的程序运行结果预期是0的,变成一个几千次方的极大数。原因是指数部分从极负变
: 成极正。 类似例子是8bit的整数减法,-127 - 1 == 128.

s*****k
发帖数: 604
12
还有一个奇怪的地方是如果在一些地方加些
printf,那么最小的a[i]就是0.0
和优化选项没关系了

2.

【在 O*******d 的大作中提到】
: 浮点数计算结果判断,不要用==。 一般用一个小范围来判断。两个相同值的浮点数相
: 加,和同一个值的浮点数乘以2,结果一般不会一样的。 就是a + a一般不等于 a * 2.
: 0, 但结果非常接近。 a - a不一定是0,但非常接近0。 我以前用过一个compiler,
: 写的程序运行结果预期是0的,变成一个几千次方的极大数。原因是指数部分从极负变
: 成极正。 类似例子是8bit的整数减法,-127 - 1 == 128.

O*******d
发帖数: 20343
13
你不知道优化做了什么东西。 我以前做过aeronics 的软件,飞机上用的软件不允许
compiler优化。 compiler甚至不能有优化的选项,也不能有优化的能力。 理由
就是优化会引进未知因素。 一切优化必须人工在source code水平上来做,并且
要通过无数的验证。 优化是一个非常费时费力的过程,所以每一个优化都要经过
一个悠长的技术,财务,人力资源上的讨论批准。

【在 s*****k 的大作中提到】
: 还有一个奇怪的地方是如果在一些地方加些
: printf,那么最小的a[i]就是0.0
: 和优化选项没关系了
:
: 2.

a****l
发帖数: 8211
14
正如大家猜测的,原因是有其他的中间过程,你的"抽象"其实就把浮点的问题给抽象掉了.

【在 s*****k 的大作中提到】
: 代码其实挺复杂的,
: 我只是把问题抽象出来说了。
: 其实我自己另外写了一段简单的代码,
: 减完后的a[]里最小值是等于0.0的
: 我原来的代码其实结果总是合理的,
: 只是我觉得可能隐藏着错误
:
: I

s*****k
发帖数: 604
15
刚才找到了一篇讲float-point arithmetic
的文章,在这里
http://hal.archives-ouvertes.fr/hal-00128124/en/
没工夫细看。但是下面这段话(在第二页)
里面讲的浮点计算的pitfall可能好多人都不知道
第二条说浮点计算不是deterministic的。
这让我想起以前好像看一个c faq里面说
计算sin(x)也不是deterministic,也就是说你在程序的两个地方
对同一个x算sin(x)的值是不一样的,当时没看懂。
我以前只当float计算就是要注意rounding error,
用abs(x-y) 现在看来好像不是
Despite, or perhaps because of, the prevalence of “IEEE-compliant” systems,
there exist a number of myths of what IEEE-compliance really entails from
the
point of vie

【在 O*******d 的大作中提到】
: 你不知道优化做了什么东西。 我以前做过aeronics 的软件,飞机上用的软件不允许
: compiler优化。 compiler甚至不能有优化的选项,也不能有优化的能力。 理由
: 就是优化会引进未知因素。 一切优化必须人工在source code水平上来做,并且
: 要通过无数的验证。 优化是一个非常费时费力的过程,所以每一个优化都要经过
: 一个悠长的技术,财务,人力资源上的讨论批准。

s*****k
发帖数: 604
16
第24页给了个例子,
说了加不加优化选项可能使
运算结果相差很大

【在 s*****k 的大作中提到】
: 刚才找到了一篇讲float-point arithmetic
: 的文章,在这里
: http://hal.archives-ouvertes.fr/hal-00128124/en/
: 没工夫细看。但是下面这段话(在第二页)
: 里面讲的浮点计算的pitfall可能好多人都不知道
: 第二条说浮点计算不是deterministic的。
: 这让我想起以前好像看一个c faq里面说
: 计算sin(x)也不是deterministic,也就是说你在程序的两个地方
: 对同一个x算sin(x)的值是不一样的,当时没看懂。
: 我以前只当float计算就是要注意rounding error,

s*****k
发帖数: 604
17
哥们你说一下原因吧。
我以前对这个的理解就是rounding error。
事实上 abs(a)<10e-20也不一定对啊
我得到的x-x 常常是 1e-16这个量级的

10e-

【在 U********d 的大作中提到】
: 浮点判零是一个经典问题啊,一定不能a==0.0,应该用类似于if(a<10e-20 && a>-10e-
: 20)的条件判断。
: 至于原因嘛……嘿嘿,不说。

a****l
发帖数: 8211
18
其实他的结论"同一个计算的结果可能是不同的"又对又不对.的确,x+y=z即使x,y是相同
的结果z也可能是不同的,但是原因是源代码和执行代码的区别,而不是说浮点计算的结
果在不同的时候会不同(针对硬件出来的结果而言).他说了很多时间,其实就是说,不要
光看源代码就说"计算值应该是多少"或者说"程序的路径应该是怎样的",因为有很多东
西可能会让这东西变化.

【在 s*****k 的大作中提到】
: 第24页给了个例子,
: 说了加不加优化选项可能使
: 运算结果相差很大

O*******d
发帖数: 20343
19
很有帮助。

【在 s*****k 的大作中提到】
: 刚才找到了一篇讲float-point arithmetic
: 的文章,在这里
: http://hal.archives-ouvertes.fr/hal-00128124/en/
: 没工夫细看。但是下面这段话(在第二页)
: 里面讲的浮点计算的pitfall可能好多人都不知道
: 第二条说浮点计算不是deterministic的。
: 这让我想起以前好像看一个c faq里面说
: 计算sin(x)也不是deterministic,也就是说你在程序的两个地方
: 对同一个x算sin(x)的值是不一样的,当时没看懂。
: 我以前只当float计算就是要注意rounding error,

s*****k
发帖数: 604
20
google 的 group里面问了,
下面这个人的答案我觉得不错
That article is very relevant, and well-worth reading thoroughly if
you have time!
It's difficult to improve on what's in the article. But in short, the
number one cause of problems like the one you mention (assuming that
you're already happy with the basics of floating-point) is that
arithmetic calculations can legally be carried out in greater
precision that you expect, and that it can be hard to predict when
this is going to happen: a single expression might

【在 O*******d 的大作中提到】
: 很有帮助。
a****l
发帖数: 8211
21
which google group? can you give a link?

【在 s*****k 的大作中提到】
: google 的 group里面问了,
: 下面这个人的答案我觉得不错
: That article is very relevant, and well-worth reading thoroughly if
: you have time!
: It's difficult to improve on what's in the article. But in short, the
: number one cause of problems like the one you mention (assuming that
: you're already happy with the basics of floating-point) is that
: arithmetic calculations can legally be carried out in greater
: precision that you expect, and that it can be hard to predict when
: this is going to happen: a single expression might

z*****a
发帖数: 3809
22
comp.lang.c
http://groups.google.com/group/comp.lang.c/msg/29d62811bd33f379

【在 a****l 的大作中提到】
: which google group? can you give a link?
1 (共1页)
进入Programming版参与讨论
相关主题
binary number question
浮点数对比
问一个for循环的问题
请教个排序的题目
startup招2个人,在san jose
tcl question
is it possible to design a zero miss rate cache?
[合集] 如何找出一个32位数中最左边的1?
问个g++的问题
C++隐式类型转换的规则?
相关话题的讨论汇总
话题: 浮点数话题: 优化话题: 等于话题: 浮点话题: fn