Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C/C++;:浮点比较速度_C++_C_Performance_Comparison_Floating Point - Fatal编程技术网

C++ C/C++;:浮点比较速度

C++ C/C++;:浮点比较速度,c++,c,performance,comparison,floating-point,C++,C,Performance,Comparison,Floating Point,我正在检查以确保浮点数不是零。浮动不可能变成负值。这样做float!=0.0f还是该浮点>0.0f 谢谢 编辑:是的,我知道这是微观优化。但是每次我的游戏循环都会调用它,我还是想知道。性能上不太可能有明显的差异。据我所知,f!=当您认为0.0f应为false时,它有时会返回true 要检查浮点数是否为非零,您应该执行Math.abs(f)>EPSILON,其中EPSILON是您可以容忍的错误 在这种比较中,性能不应该是一个大问题 如果不了解您的平台和编译器,就不可能给出明确的答案。C标准没有定义

我正在检查以确保浮点数不是零。浮动不可能变成负值。这样做
float!=0.0f
还是该
浮点>0.0f

谢谢


编辑:是的,我知道这是微观优化。但是每次我的游戏循环都会调用它,我还是想知道。

性能上不太可能有明显的差异。

据我所知,
f!=当您认为0.0f应为false时,它有时会返回true

要检查浮点数是否为非零,您应该执行
Math.abs(f)>EPSILON
,其中
EPSILON
是您可以容忍的错误


在这种比较中,性能不应该是一个大问题

如果不了解您的平台和编译器,就不可能给出明确的答案。C标准没有定义浮动是如何实现的

在某些平台上,是的,在其他平台上,不是


如果有疑问,请测量。

这几乎可以肯定是一种微观优化,除非有定量数据表明这是一个问题,否则你不应该这样做。如果你能证明这是一个问题,你应该弄清楚如何让你的编译器显示它生成的机器指令,然后获取这些信息,转到你正在使用的处理器的数据手册,并查找相同逻辑的替代实现所需的时钟周期数。然后,你应该再次衡量,以确保你看到的好处,如果有的话


如果您没有任何数据显示这是一个性能问题,请坚持使用最清晰、最简单地显示您尝试执行的逻辑的实现。

考虑一下,仅出于娱乐目的:

只有两个浮点值比较等于
0f
:零和负零,并且它们仅在1位处不同。因此,测试31个非符号位是否清晰的电路/软件仿真就可以做到这一点

0f
的比较稍微复杂一些,因为负数和0会导致false,正数会导致true,但是NaN(两个符号的)也会导致false,所以它不仅仅是检查符号位

根据浮点模式的不同,这两种操作都可能导致浮点寄存器中的超精确结果在比较之前四舍五入到32位,因此分数在那里是相等的

如果有什么区别的话,我有点期待
=更快,但我并不真的期望有什么不同,我也不会对在某些特定实现上出错感到非常惊讶


我假设您证明的值不能为负值不会出现浮点错误。例如,如果错误发生累积而不是消除,则沿着
1/2.0-1/3.0-1/6.0
0.4-0.2-0.2
的直线进行的计算可能会产生正值或负值,因此可能不会发生类似的情况。关于与0相等的浮点测试的唯一实际用途,是测试您是否为其分配了文字
0
。或者某些其他计算的结果保证在
float
中有结果
0
,但这可能很棘手。

float可能是负数。它们也可能在零左右摇摆不定。微型优化这个词突然出现在我的脑海中!这种差异,如果有的话,可能非常小,你永远不会注意到这种差异。您是否分析了您的代码并发现这种特殊的比较是一个性能瓶颈?如果有区别的话,也很可能是特定于体系结构和CPU的。您确定如果该值为零,它将正好为零吗?请记住,浮点计算通常是不精确的。除非明确设置
f=0.0f,您需要解释计算错误。@Jay:如果它们可以为零,那么它们很可能为负。即使数学上说它们应该等于0,浮点运算的现实意味着它可能非常接近于零,但有负面影响。@Jay:作为一名游戏开发人员,我要告诉你,如果你不知道如何确定使用哪个版本,那么你的游戏的性能就不够高,不需要知道。始终编写最干净的代码。永远不要写“最快”的代码,因为除非你有一个干净的、可运行的程序,否则这并不重要。你想快点吗<代码>int main(){}
。我保证这比你能写的任何东西都快。“但它什么也没用!”写得快而不是正确的坏代码也没用。仅供参考,他说数字总是>=0,所以你不需要abs。而
float>0.0f
,或者更好的
float>EPSION
更安全。关于你的最后一段,通过反复乘以一个小于1的值来降低浮点值。在硬件级别上,检查可以并行执行,因此两个检查所需的时间相同。考虑到分支错误预测的成本要高得多,在速度上不会有任何差别。@ruslik:可以并行执行,还是保证并行执行?因此,速度不会有差异,或者很可能速度不会有差异?换句话说,你认为没有人能够给出一个速度不同的C实现的可能性有多大?您是否有信心提供1000:1?我的钱会花在一些相对简单的CPU上的软件浮动上,比如早期的系列ARM,这是最有可能产生差异的。