getting rid of signed zero
我正在做一些矩阵运算,其中矩阵元素通过以下方式从某些变量获取值:
,但是当x = 0时,它会在矩阵中设置-0,这是不希望的。有什么明确的方法可以防止这种情况?
- 矩阵元素的类型是什么?为什么-0是不理想的?
-
如果可能完全发生这种类型,则该类型可能是float或double。
-
矩阵为浮点型
-
stackoverflow.com/questions/2084970/…建议:if (x == 0.) { x = 0.;}
-
也许std :: fpclassify对您有帮助:en.cppreference.com/w/cpp/numeric/math/fpclassify
-
带符号的零是IEEE 754标准的一部分。您无能为力。对于大多数目的(主要是算术运算),它应该没有区别。如果在您的实现中很重要,则只需遍历矩阵并将所有零设置为0;否则,将其设置为0。
-
它在矩阵中设置了-0,这是不希望的-为什么您认为这是不希望的? 0.0和-0.0比较相等。有趣的是,0.0和-0.0都是不正确的,因为零既不是正数也不是负数。数学仍然可以使用带零的符号或-进行运算。
您可以执行以下操作:
我已经测试了以下代码:
1 2 3
| float a = -0.0;
printf("%f %f\
", a, a + 0.0); |
将产生以下输出:
- 如果可以保证IEEE 754可以正常工作,那就太好了(无分支!),但这是吗?据我所知,x /-0.0 = x,所以我认为优化整个语句将是有效的编译器优化。另外,这是否取决于舍入模式?
-
@Damon我不确定为什么会这样。实际上,-0.0 + 0.0 == 0.0和-0.0 + -0.0 == -0.0(至少在我的gcc中)对我来说很奇怪。