我有一些代码已从Java移植到C ++
// since this point is a vector from (0,0,0), we can just take the
// dot product and compare
double r = point.dot(normal);
return (r>=0.0);
但是在C ++ r
中,可以是+0.0
或-0.0
,当r
等于时-0.0
它将失败检查。
我试图在下面的代码中将负零值进行调整,但它从未命中DEBUG(“ Negative zero”)行。但是r2
打印等于+0.0
。
// since this point is a vector from (0,0,0), we can just take the
// dot product and compare
double r = point.dot(normal);
if (std::signbit(r)){
double r2 = r*-1;
DEBUG("r=%f r=%f", r,r2);
if (r2==0.0) {
DEBUG("Negative zero");
r = 0.0; //Handle negative zero
}
}
return (r>=0.0);
有什么建议吗?
测试代码:
DEBUG("point=%s", point.toString().c_str());
DEBUG("normal=%s", normal->toString().c_str());
double r = point.dot(normal);
DEBUG("r=%f", r);
bool b = (r>=0.0);
DEBUG("b=%u", b);
测试结果:
DEBUG - point=Vector3D[ x=1,y=0,z=0 ]
DEBUG - normal=Vector3D[ x=0,y=-0.0348995,z=0.0348782 ]
DEBUG - r=0.000000
DEBUG - b=1
DEBUG - point=Vector3D[ x=1,y=0,z=0 ]
DEBUG - normal=Vector3D[ x=-2.78269e-07,y=0.0174577,z=-0.0174391 ]
DEBUG - r=-0.000000
DEBUG - b=0
GCC:
Target: x86_64-linux-gnu
--enable-languages=c,c++,fortran,objc,obj-c++
--prefix=/usr
--program-suffix=-4.6
--enable-shared
--enable-linker-build-id
--with-system-zlib
--libexecdir=/usr/lib
--without-included-gettext
--enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.6
--libdir=/usr/lib
--enable-nls
--with-sysroot=/
--enable-clocale=gnu
--enable-libstdcxx-debug
--enable-libstdcxx-time=yes
--enable-gnu-unique-object
--enable-plugin
--enable-objc-gc
--disable-werror
--with-arch-32=i686
--with-tune=generic
--enable-checking=release
--build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
旗帜:
CXXFLAGS += -g -Wall -fPIC
回答:
我已经使用@amit的答案来进行以下操作。
return (r>=(0.0-std::numeric_limits<double>::epsilon()));
这似乎可行。
好吧,使用double
s 时的一般建议是记住它们是不精确的。因此,如果平等很重要-通常建议使用一些容忍因子。
在您的情况下:
if (|r - 0.0| >= EPSILON)
哪里EPSILON
是您的公差系数,如果r
不是0.0,且EPSILON
间隔至少一定,则将为true 。
问题内容: CSS3的resize属性可以分配给任意元素。我正在寻找一种方法来检测divs的这种大小变化(我不介意目前仅在Firefox中有效): 不幸的是,该事件似乎并未在div上触发。发生这种由用户指示的调整大小时,如何在JavaScript中进行检测? 编辑: FWIW我已经在Mozilla打开了一个错误报告。 问题答案: 听事件。从这个答案中得到了想法,这个jsFiddle似乎可以在Fir
问题内容: 我使用Qt Designer创建了一个简单的UI,并将其转换为Python代码。我搜索了任何方法来检测不断变化的窗口大小。 这是生成的代码: 我发现类似的问题QWidget调整大小信号吗?而本教程将介绍建议重写 QMainWindow的 resizeEvent 方法的大小。 __ 但是他们中的任何一个都不能解决我的问题。是否有任何 调整大小的 功能来检测窗口的大小,如下所示: 问题答案
问题内容: 我有一个JTable,它使用a 来检测何时调整了列的大小,并且我想在该方法中执行一些代码。 如何确定该列是由用户调整大小还是由于其他代码导致? 我以为我必须从头开始,但我不知道从那里去哪里。 谢谢。 问题答案: 我可以给你一种可能的方法。我试图解决相同的问题,因为我想将有关列宽的信息序列化到磁盘上,以便下次在应用程序中打开表时,可以适当地恢复列宽。开始: 第1步-覆盖您的JTable并
问题内容: 当用户结束调整浏览器窗口大小时,jQuery或JavaScript有什么办法触发函数? 换句话说: 用户调整浏览器窗口大小时是否可以检测到鼠标向上移动事件?除此以外: 我可以检测到窗口调整大小操作何时完成吗? 我目前只能在用户开始使用jQuery调整窗口大小时触发事件 问题答案: 您可以使用每次实际改变宽度/高度时获取,如下所示: 它会使用新的高度/宽度值并在页面中对其进行更新以供您查
我知道这有点难,但我正在学习普林斯顿大学的算法课程。我尝试使用Bellman-Ford算法来检测边加权有向图中的负圈。 完整的代码实现可从以下网址获得:BellmanFordSP。java和EdgeWeightedDirectedCycle。JAVA具体来说,我被困在这一点上: 这个条件表示什么:。为什么我们只在这个特定的条件下检查负循环?
问题内容: 我有一个HTML文档,该文档使用AJAX调用从PHP文件加载内容。我的代码的重要部分如下: default.html: “ content.php”中的文件是否有可能检测到是否已从“ default.html”或其他调用文档中对其进行了调用? 问题答案: jQuery和mooTools等最著名的Ajax框架都会添加一个特定的标头,您可以使用PHP进行检查: