我有一个64位无符号整数,正好设置了1位.我想为每个可能的64个值分配一个值(在这种情况下,奇数素数,因此0x1对应于3,0x2对应于5,...,0x8000000000000000对应于313).
似乎最好的方法是转换1 - > 0,2 - > 1,4 - > 2,8 - > 3,...,2 ^ 63 - > 63并查找数组中的值.但即使如此,我也不确定获得二进制指数的最快方法是什么.并且可能还有更快/更好的方法.
此操作将使用10 14到10 16次,因此性能是一个严重的问题.
由Carl Norum编辑,包括适当的标准参考.
C标准规定
如果在计算表达式期间发生异常情况(即,如果结果未在数学上定义或未在其类型的可表示值范围内),则行为未定义.
是否有编译器开关可以保证整数溢出时的某些行为?我想避免鼻腔恶魔.特别是,我想强制编译器包装溢出.
为了唯一性,让标准为C99,编译器为gcc.但我会对其他编译器(icc,cl)和其他标准(C1x,C89)的答案感兴趣.事实上,只是为了惹恼C/C++人群,我甚至欣赏C++ 0x,C++ 03和C++ 98的答案.
注:国际标准ISO/IEC 10967-1可能与此相关,但据我所知,仅在资料性附录中提到过.
感谢bit Twiddling的一些非常有用的stackOverflow用户:设置了哪个位?,我已经构建了我的函数(在问题的最后发布).
任何建议 - 即使是小建议 - 将不胜感激.希望它能使我的代码更好,但至少它应该教会我一些东西.:)
此函数将被调用至少10 13次,并且可能经常被调用10 15次.也就是说,此代码很可能会运行数月,因此任何性能提示都会有所帮助.
该功能占计划时间的72-77%,基于分析和不同配置中的大约十二次运行(优化这里不相关的某些参数).
此功能目前平均运行50个时钟.我不确定这可以改进多少,但我很高兴看到它在30岁时运行.
如果在计算的某个时刻你可以告诉你将返回的值很小(准确值可协商 - 比如说,低于一百万)你可以提前中止.我只对大价值感兴趣.
这就是我希望节省大部分时间的方式,而不是通过进一步的微观优化(尽管这些当然也是受欢迎的!).
添加以响应请求.您无需阅读此部分.
输入是奇数n,1 <n <4282250400097.其他输入提供了这个特定意义上的数字因子分解:
如果数字可被3整除,则设置smallprimes&1;如果数字可被5整除,则设置smallprimes&2;如果数字可被7整除,则设置smallprimes&4;如果数字可被11整除,则设置smallprimes和8,等等.表示313的有效位.可以用素数的平方整除的数字与仅被该数字整除的数字表示不同.(实际上,可以丢弃多个正方形;在另一个函数的预处理阶段,素数的多个正方形<= lim具有小的primes而q设置为0因此它们将被丢弃,其中lim的最佳值通过实验确定. )
q,r和s代表数字的较大因子.任何剩余因子(可能大于数字的平方根,或者如果s非零甚至可能更小)可以通过将因子除以n来找到.
一旦以这种方式恢复所有因子,使用由代码最佳解释的数学公式计算n为强伪荧光的碱基数1 <= b <n .
__attribute__ ((inline))什么都不做.奇怪的是,标记主要功能bases和一些助手__attribute ((hot))伤害性能几乎2%,我无法弄清楚为什么(但它可以重现超过20次测试).所以我没有做出改变.同样, …我正在尝试使用MySQL 5.0中的变量进行一些简单的操作,但我无法让它工作.我见过DECLARE/SET的很多(非常!)不同的语法,我不知道为什么......无论如何我可能会混淆他们/选错了/混合他们.
这是一个失败的最小片段:
DECLARE FOO varchar(7);
DECLARE oldFOO varchar(7);
SET FOO = '138';
SET oldFOO = CONCAT('0', FOO);
update mypermits
set person = FOO
where person = oldFOO;
Run Code Online (Sandbox Code Playgroud)
我也试过用BEGIN包裹它......结束; 并作为程序.在这种情况下,MySQL Workbench有助于告诉我:第一行上的"SQL语法错误')'"和第二行上的"DECLARE oldFOO varchar(7)'附近的SQL语法错误".否则它会将两行都作为完整错误,两者都有"SQL语法错误接近...".
编辑:我忘了提到我已经在变量上使用和不使用@s.有些资源有,有些没有.
我犯了什么愚蠢的错误?
我正在为Perl寻找一个lint,它可以捕获死代码和其他潜在的问题.有什么建议?
我有
use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)
已经但我想要更多.
我有一个名为的数据框,df如下所示:
dte, val
2012-01-01, 23.2323
2012-01-02, 34.343
Run Code Online (Sandbox Code Playgroud)
列上的类型是日期和数字.我想使用已经打开的连接将其写入MySQL数据库.连接工作正常,因为我能够查询db罚款.我尝试运行以下内容:
dbWriteTable(con, name="table_name", value=df, field.types=list("date", "double(20,10)"))
Run Code Online (Sandbox Code Playgroud)
这会生成错误:
函数错误(classes,fdef,mtable):无法找到函数"make.db.names"的继承方法,签名为"MySQLConnection","NULL"
如果我没有指定field.types,并运行:
dbWriteTable(con, name="table_name", value=df)
Run Code Online (Sandbox Code Playgroud)
我收到错误:
mysqlExecStatement(conn,statement,...)出错:RS-DBI驱动程序:(无法运行语句:BLOB/TEXT列'dte'在密钥规范中使用,没有密钥长度)
任何人都可以对此有所了解吗?
谢谢
假设我们有正则表达式:
我想最小化匹配任意输入所需的正则表达式的数量.
为此,我需要查找一个正则表达式是否与另一个表达式匹配的任何输入匹配.那可能吗?
Billy3
我正在寻找64位(无符号)立方根的快速代码.(我正在使用C并使用gcc进行编译,但我认为所需的大部分工作都是语言和编译器无关的.)我将通过ulong表示64位未分配的整数.
给定输入n我需要(整数)返回值r
r * r * r <= n && n < (r + 1) * (r + 1) * (r + 1)
Run Code Online (Sandbox Code Playgroud)
也就是说,我想要n的立方根,向下舍入.基本代码如
return (ulong)pow(n, 1.0/3);
Run Code Online (Sandbox Code Playgroud)
因为向范围的末端舍入而不正确.简单的代码就像
ulong
cuberoot(ulong n)
{
ulong ret = pow(n + 0.5, 1.0/3);
if (n < 100000000000001ULL)
return ret;
if (n >= 18446724184312856125ULL)
return 2642245ULL;
if (ret * ret * ret > n) {
ret--;
while (ret * ret * ret > n)
ret--;
return ret;
}
while ((ret + 1) * (ret + …Run Code Online (Sandbox Code Playgroud) 我正在寻找有关Perl最佳实践的建议.我写了一个脚本,它有一个复杂的正则表达式:
my $regex = qr/complicated/;
# ...
sub foo {
# ...
if (/$regex/)
# ...
}
Run Code Online (Sandbox Code Playgroud)
where foo是一个经常被调用的函数,并且$regex不在函数之外使用.处理这种情况的最佳方法是什么?我只希望它被解释一次,因为它漫长而复杂.但是将它放在全球范围内似乎有点可疑,因为它仅用于该子目录.是否有合理的方法将其声明为静态?
另一个可能不合理的全球性问题也出现了类似的问题.它读取当前日期和时间并适当地格式化它.这也被多次使用,并且仅在一个功能中使用.但是在这种情况下更重要的是它不能重新初始化,因为我希望日期时间的所有实例在给定的脚本调用中是相同的,即使在执行期间分钟翻转.
目前我有类似的东西
my ($regex, $DT);
sub driver {
$regex = qr/complicated/;
$DT = dateTime();
# ...
}
# ...
driver();
Run Code Online (Sandbox Code Playgroud)
至少略微隔离它.但也许有更好的方法.
再说一遍:我正在寻找正确的方法,以遵循最佳实践和Perl习语.性能很好,但如果我不能拥有所有东西,那么可读性和其他需求就会优先考虑.
有没有办法用正则表达式内联替换文本,而不是从变量中取出文本并将其存储在变量中?
我是初学者.我经常发现自己写作
my $foo = $bar;
$foo =~ s/regex/replacement/;
doStuff($foo)
Run Code Online (Sandbox Code Playgroud)
我真的很想写的地方
doStuff($bar->replace(s/regex/replacement/));
Run Code Online (Sandbox Code Playgroud)
或者类似,而不是使用临时变量和三行.
有没有办法做到这一点?显然,当正则表达式足够复杂时,将它拆分出来以便更好地解释是有意义的,但是当它只是s/\s//g用其他变量使代码混乱时感觉是错误的.