草庐IT

sqrt-heavy-loop

全部标签

c++ - 是否可以推出更快的 sqrt 版本

在我正在分析的应用程序中,我发现在某些情况下,此函数能够占用总执行时间的10%以上。多年来,我看到过关于使用偷偷摸摸的浮点技巧实现更快sqrt的讨论,但我不知道这些东西在现代CPU上是否已经过时。正在使用MSVC++2008编译器,供引用……虽然我认为sqrt不会增加太多开销。有关modf的类似讨论,请参见此处。功能。编辑:供引用,this是一种广泛使用的方法,但它实际上更快吗?现在SQRT到底有多少个周期? 最佳答案 是的,即使没有诡计也是可能的:牺牲精度换取速度:sqrt算法是迭代的,用更少的迭代重新实现。查找表:要么仅用于迭代

c++ - 添加!运算符和 sqrt()、pow() 等到计算器示例应用程序

我正在做Stroustrup新书"ProgrammingPrinciplesandPracticeUsingC++"中的练习并且想知道StackOverflow上是否有人做过并愿意分享知识?具体说一下第6章和第7章开发的计算器。比如添加!操作符和sqrt()、pow()等问题。这些我都做过,但是我不知道我的解决方案是不是“好”的做事方式,Bjarne的网站上也没有公布的解决方案。我想知道我是否走在正确的轨道上。也许我们可以为练习制作一个wiki?基本上我有一个token解析器。它一次从cin读取一个字符。它旨在标记5*3+1之类的表达式,并且非常适合。练习之一是添加一个sqrt()函数

c++ - cmath 中 sqrt、sin、cos、pow 等的定义

sqrt()、sin()、cos()、tan()、log()、exp()(这些来自math.h/cmath)可用?我只是想知道它们是如何工作的。 最佳答案 这是一个有趣的问题,但是除非您碰巧知道使用的方法,否则阅读高效库的资源不会让您走得太远。这里有一些提示可以帮助您理解经典方法。我的信息绝不准确。以下方法仅为经典方法,具体实现可以使用其他方法。经常使用查找表三角函数通常通过CORDIC实现算法(在CPU上或使用库)。请注意,通常正弦和余弦是一起计算的,我一直想知道为什么标准C库不提供sincos函数。平方根使用Newton'sme

c++ - Range-for-loops 和 std::vector<bool>

为什么这段代码有效std::vectorintVector(10);for(auto&i:intVector)std::cout这不是吗?std::vectorboolVector(10);for(auto&i:boolVector)std::cout在后一种情况下,我得到一个错误error:invalidinitializationofnon-constreferenceoftype‘std::_Bit_reference&’fromanrvalueoftype‘std::_Bit_iterator::reference{akastd::_Bit_reference}’for(aut

c++ - 将 Sqrt(x) 计算为 x * InvSqrt(x) 在 Doom 3 BFG 代码中是否有意义?

我浏览了最近发布的Doom3BFGsourcecode,当我遇到一些似乎没有任何意义的事情时。Doom3在idMath中封装了数学函数。类(class)。有些函数只是从math.h转发给相应的函数,但有些是重新实现(例如idMath::exp16()),我认为它们的性能比它们的math.h对应物(可能以牺牲精度为代价)。然而,让我感到困惑的是他们实现floatidMath::Sqrt(floatx)函数的方式:ID_INLINEfloatidMath::InvSqrt(floatx){return(x>FLT_SMALLEST_NON_DENORMAL)?sqrtf(1.0f/x):I

c++ - 尽可能快地比较 (a + sqrt(b)) 形式的两个值?

作为我正在编写的程序的一部分,我需要比较a+sqrt(b)形式的两个值在哪里a和b是无符号整数。由于这是一个紧密循环的一部分,我希望这个比较尽可能快地运行。(如果重要的话,我在x86-64机器上运行代码,无符号整数不大于10^6。另外,我知道a1。)作为一个独立的功能,这是我想要优化的。我的数字是足够小的整数double(甚至float)可以准确地表示它们,但是sqrt中的舍入错误结果不能改变结果。//knownpre-condition:a1测试用例:is_smaller(900000,1000000,900001,998002)应该返回true,但正如@wim使用sqrtf()计算

c++ - 获取 sqrt(n) 整数部分的最快方法?

据我们所知,如果n不是一个完美的正方形,那么sqrt(n)不会是整数。由于我只需要整数部分,我觉得调用sqrt(n)不会那么快,因为计算小数部分也需要时间。所以我的问题是,我们能不能只得到sqrt(n)的整数部分而不计算sqrt(n)的实际值??该算法应该比sqrt(n)更快(在或中定义)?如果可能,您可以将代码写入asm也阻止。 最佳答案 我会尝试FastInverseSquareRoot把戏。这是一种在没有任何分支的情况下获得1/sqrt(n)的非常好的近似值的方法,基于一些比特旋转,因此不可移植(尤其是在32位和64位平台之间

for-loop - 在 Go 中并发访问具有 'range' 的 map

Go博客中的“Gomapsinaction”条目指出:Mapsarenotsafeforconcurrentuse:it'snotdefinedwhathappenswhenyoureadandwritetothemsimultaneously.Ifyouneedtoreadfromandwritetoamapfromconcurrentlyexecutinggoroutines,theaccessesmustbemediatedbysomekindofsynchronizationmechanism.Onecommonwaytoprotectmapsiswithsync.RWMute

for-loop - 如何检查for循环内的唯一性?

有没有办法检查slice/映射是否存在值?如果slice中确实存在不,我想为slice添加一个值仅.这可行,但看起来很冗长。有没有更好的方法来做到这一点?orgSlice:=[]int{1,2,3}newSlice:=[]int{}newInt:=2newSlice=append(newSlice,newInt)for_,v:=rangeorgSlice{ifv!=newInt{newSlice=append(newSlice,v)}}newSlice==[213] 最佳答案 您的方法每次插入都需要线性时间。更好的方法是使用map[

loops - 有没有办法迭代一系列整数?

Go的范围可以迭代map和slice,但我想知道是否有一种方法可以迭代一系列数字,如下所示:fori:=range[1..10]{fmt.Println(i)}或者有没有办法在Go中表示整数范围,就像Ruby对classRange所做的那样?? 最佳答案 Go中的惯用方法是编写这样的for循环。fori:=1;i范围肯定有优势,并且它们被用于许多其他语言,但Go的设计原则是仅在yield显着超过成本(包括使语言更大的成本)时才引入抽象。理性的人不同意范围的成本和yield,但这个答案是我试图描述我认为惯用的Go是什么。