【问题标题】:Does the std::sqrt function in c++ slow down as the number gets larger?c++ 中的 std::sqrt 函数是否会随着数字变大而变慢?
【发布时间】:2014-10-01 06:44:42
【问题描述】:

我正在实现自己的数学库,目前我需要标准化向量和四元数。

性能对我来说将是一个大问题,因此我一直想知道,因为我的数字可能会扩展到相当高的限制,C++ 中的std::sqrt 函数是否会随着数字的大小而变得越来越慢增加还是总是在相同的时间内执行?

这个问题专门与 C++11 中的性能有关。

【问题讨论】:

  • C++ 不提供任何保证。最好的策略是通过根据实际输入分析您的代码来衡量性能,而不是对性能进行假设。
  • 测试一下。我预计时间不会有太大差异,但这是可能的。此外,任何差异都可能不会与输入值的增加单调相关。相反,如果有任何差异,则可能是处理速度较慢或速度较快的值“随机”分散在整个范围内。也许不同类别的值之间的性能不同,例如非规范化浮点数平均比规范化浮点数慢。
  • 有道理,我会这样做,完成后将结果发布在这里。
  • 没有明显区别。
  • @TNA:对于(非常)小的数字,所需的时间实际上更长。对于 x x。例如。 sqrt(1/4) = 1/2。现在如果 x 是非正规的,那么 sqrt(x) 是一个常规数字 >0 。这不能优化为 0。所以实际上你会期望 sqrt(x) 对 small 数字变慢,而不是很大。

标签: c++ c++11


【解决方案1】:

实际上,不会。

现代系统中的浮点数表示为符号、指数和尾数。这里的符号必须是0,这很简单。取两个数字,x4*x。它们表示的唯一区别是第二个的指数高出 2。 (除非在极端范围内,4*x 可能是 +INF,但我们忽略它。)

现在sqrt(4*x) == 2 * sqrt(x),我们在这里看到结果的指数高一,但尾数相同。

这意味着计算平方根所需的时间与数字的指数无关。您只需在恒定时间内排除4^nsqrt(x) 的难点在于计算结果的尾数,这取决于两件事:输入的尾数和输入的指数是否为奇数。

【讨论】:

    【解决方案2】:

    对于肉眼来说,它没有..或者我会说非常小的差异..

    如果您担心自己的实施,我建议您实施

     Babylonian Method for Square Root  --> it is much faster then others.. 
    

    Babylonian Method on Wiki

    babyionian 的其他链接很少

    http://mathlesstraveled.com/2009/05/18/square-roots-with-pencil-and-paper-the-babylonian-method/

    http://www.homeschoolmath.net/teaching/square-root-algorithm.php

    【讨论】:

    • 巴比伦的方法不会打败硬件。
    • 我第一次听说这个叫做贝伦方法;对我来说,它看起来像牛顿-拉夫森方法。它的性能很大程度上取决于你的第一个猜测有多好。 (但正如@MSalters 所说,即使有一个很好的初步猜测,它也不会击败硬件。)
    • 击败硬件是另一回事。@MSalters 我有没有说过它会击败硬件?? ;) 是的.. 詹姆斯你是对的.. 这取决于你的第一个猜测..
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2014-02-04
    • 2021-12-05
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多