1

我标准化了一个向量,它的长度应该是1。但是长度方法的结果是0.99999982

我不知道这是对还是错。但是如果我打印出来,结果是 1。不是 0.99999982(由 cout 打印)

但是 std::cout 怎么知道它是 1 呢?[这是我的第一个问题]

另一个问题是为什么比较函数的结果是错误的。

我有一个如下的比较方法。而 lhs 是向量的长度,而 rhs 只是 1。

return (fabsf(rhs-lhs) <= FLT_EPSILON) ? true : false;

这种方法的结果是假的。

归一化向量的长度是否已经错误地被认为是归一化的?还是 epsilon 太小?

我做错了什么?

4

2 回答 2

4

epsilon 太小了。那是因为epsilon 是最小的。(根据定义)

因此,您将需要更大的容差。

于 2011-09-21T03:33:07.120 回答
1

IEEE 标准要求加法、减法、乘法和除法的结果必须精确四舍五入。然后必须将结果四舍五入到最接近的浮点数。浮点误差在归一化向量所需的许多运算符中累积。就像另一张海报说的 FLT_EPSILON 太小了。

于 2011-09-21T04:29:01.653 回答