h*****f 发帖数: 248 | 1 C++ FAQ建议用以下的code來test whether 2 doubles are equal
#include /* for std::abs(double) */
inline bool isEqual(double x, double y)
{
const double epsilon = /* some small number such as 1e-5 */;
return std::abs(x - y) <= epsilon * std::abs(x);
// see Knuth section 4.2.2 pages 217-218
}
想问为什么要用:
return std::abs(x - y) <= epsilon * std::abs(x);
而不是用:
return std::abs(x - y) <= epsilon;
Knuth section 4.2.2提到
std::abs(x - y) <= epsilon * std::abs(x) || std::abs(x - y) <= epsilon * std
::abs(y)
沒有
std::abs(x - y) <= epsilon * std::abs(x) && std::abs(x - y) <= epsilon * std
::abs(y)
strong.
可是我沒看懂.... | t****t 发帖数: 6806 | 2 这不是挺明白的吗? 绝对误差和相对误差的关系. 哪儿不明白呢?
【在 h*****f 的大作中提到】 : C++ FAQ建议用以下的code來test whether 2 doubles are equal : #include /* for std::abs(double) */ : inline bool isEqual(double x, double y) : { : const double epsilon = /* some small number such as 1e-5 */; : return std::abs(x - y) <= epsilon * std::abs(x); : // see Knuth section 4.2.2 pages 217-218 : } : 想问为什么要用: : return std::abs(x - y) <= epsilon * std::abs(x);
| a****l 发帖数: 8211 | 3 其实我觉得这个faq写的不完全对。两个浮点数相同的的话就是说二进制数是相同,这是
没有任何疑问的。不能直接比较的原因是计算有误差,就是说数学上应该相同的计算结
果计算机出来的可能是不同的,数学上应该是不同的计算结果计算机出来的可能是相同
的二进制数。所以这是一个“应用”的问题,而不是一个“语言”的问题。if (x == y)
本身没有任何问题而且是完全合理的,关键是使用的人要知道这到底是什么意思。两个
浮点数能否比较不应该是c语言应该考虑的问题,而是数值计算应该考虑的问题,而且数
值计算本身就是一个非常复杂的学科,是否相等是里面一个非常非常简单的入门问题.
http://www.cygnus-software.com/papers/comparingfloats/comparing
举个例子,如果要计算a/(b-c),怎么做?
float sample(float a, float b, float c)
{ if ( b==c ) {oops..} else return a/(b-c);}
当然还有其他的问题,但是这是数值计算里面讨论的了.
【在 h*****f 的大作中提到】 : C++ FAQ建议用以下的code來test whether 2 doubles are equal : #include /* for std::abs(double) */ : inline bool isEqual(double x, double y) : { : const double epsilon = /* some small number such as 1e-5 */; : return std::abs(x - y) <= epsilon * std::abs(x); : // see Knuth section 4.2.2 pages 217-218 : } : 想问为什么要用: : return std::abs(x - y) <= epsilon * std::abs(x);
| h*****f 发帖数: 248 | 4 Obviously, I wasn't awake.
Thanks for pointing out! :)
【在 t****t 的大作中提到】 : 这不是挺明白的吗? 绝对误差和相对误差的关系. 哪儿不明白呢?
|
|