我需要在循环中有效地将一些常量添加或乘以 double 类型的结果以防止下溢。例如,如果我们有 int,则乘以 2 的幂将很快,因为编译器将使用位移位。是否有一种常量形式可用于高效的double 加法和乘法?
编辑:似乎没有多少人理解我的问题,为我的草率道歉。我将添加一些代码。
如果 a 是一个 int,这个(乘以 2 的幂)会更有效率
int a = 1;
for(...)
for(...)
a *= somefunction() * 1024;
当 1024 被替换为 1023 时。不确定如果我们想添加到 int 什么是最好的,但这不是我的兴趣。我对 a 是 double 的情况很感兴趣。哪些形式的常量(例如 2 的幂)可以有效地和相乘成 double ?常量任意,只要足够大以防止下溢即可。
这可能不仅限于 C 和 C++,但我不知道更合适的标签。
最佳答案
在大多数现代处理器上,只需乘以 2 的幂(例如,x *= 0x1p10; 乘以 210 或 x *= 0x1p -10; 除以 210) 将是快速且无错误的(除非结果大到上溢或小到下溢)。
对于某些浮点运算,有些处理器具有“提前输出”功能。也就是说,当某些位为零或满足其他条件时,它们会更快地完成指令。然而,浮点加法、减法和乘法通常在大约四个 CPU 周期内执行,因此即使没有早期输出,它们也相当快。此外,大多数现代处理器一次执行多条指令,因此在进行乘法运算的同时进行其他工作,并且它们是流水线式的,因此通常可以在每个 CPU 周期中开始(并完成)一次乘法运算。 (有时更多。)
乘以 2 的幂没有舍入误差,因为有效数(值的小数部分)没有改变,所以新的有效数是可以精确表示的。 (除乘以小于 1 的值外,有效位数的位可能会被压到低于浮点类型的限制,从而导致下溢。对于常见的 IEEE 754 double 格式,只有当值小于0x1p-1022.)
不要使用除法来缩放(或反转先前缩放的效果)。相反,乘以倒数。 (要删除之前的 0x1p57 缩放比例,乘以 0x1p-57。)这是因为除法指令在大多数现代处理器上都很慢。例如,30 个周期并不罕见。
关于c++ - double 的高性能加法和乘法的常量形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11806581/
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
在添加一些空格以使代码更具可读性时(与上面的代码对齐),我遇到了这个:classCdefx42endendm=C.new现在这将给出“错误数量的参数”:m.x*m.x这将给出“语法错误,意外的tSTAR,期待$end”:2/m.x*m.x这里的解析器到底发生了什么?我使用Ruby1.9.2和2.1.5进行了测试。 最佳答案 *用于运算符(42*42)和参数解包(myfun*[42,42])。当你这样做时:m.x*m.x2/m.x*m.xRuby将此解释为参数解包,而不是*运算符(即乘法)。如果您不熟悉它,参数解包(有时也称为“spl