对于打包f0并f1放入同一字节的实现,下面的程序是定义的吗?
struct S0 {
unsigned f0:4;
signed f1:4;
} l_62;
int main (void) {
(l_62.f0 = 0) + (l_62.f1 = 0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我对C99和C11的答案感兴趣,如果有理由认为它在那里是不同的.
在C99中,我发现的只有6.5:2:
在前一个和下一个序列点之间,一个对象的存储值最多只能通过表达式的评估来修改一次.[...]
我不清楚这一段对上述计划有何影响.
基于大量随机测试,大多数编译器似乎生成代码,其中两个分配不会干扰.
以GCC优化命名的"严格别名"是编译器假设内存中的值不会通过类型的左值("声明的类型")访问,该值与写入的值的类型非常不同( "有效型").如果必须考虑写入指针float可以修改类型的全局变量,则该假设允许代码转换是不正确的int.
GCC和Clang都是从充满暗角的标准描述中提取出最多的含义,并且在实践中对生成代码的性能有偏见,假设指向a的int第一个成员的struct thing指针不会将指向第int一个成员的指针作为别名一个struct object:
struct thing { int a; };
struct object { int a; };
int e(struct thing *p, struct object *q) {
p->a = 1;
q->a = 2;
return p->a;
}
Run Code Online (Sandbox Code Playgroud)
GCC和Clang的推断该函数总是返回1,也就是说,p且q不能为同一个内存位置的别名:
e:
movl $1, (%rdi)
movl $1, %eax
movl $2, (%rsi)
ret
Run Code Online (Sandbox Code Playgroud)
只要有人同意这种优化的推理,就不足为奇了,p->t[3]并且q->t[2]在下面的代码片段中也假设是不相交的左值(或者更确切地说,如果它们别名,调用者会导致UB):
struct arr { int t[10]; };
int h(struct …Run Code Online (Sandbox Code Playgroud) 据我所知,=和!=应该用于OCaml中的字符串.我看到了奇怪的结果,虽然我想更好地理解.
当我用=比较两个字符串时,我得到了我期望的结果:
# "steve" = "steve";;
- : bool = true
# "steve" = "rowe";;
- : bool = false
Run Code Online (Sandbox Code Playgroud)
但是当我尝试的时候!=我没有:
# "steve" != "rowe";;
- : bool = true
# "steve" != "steve";; (* unexpected - shouldn't this be false? *)
- : bool = true
Run Code Online (Sandbox Code Playgroud)
谁能解释一下?有一个更好的方法吗?
什么是比较两个浮点值以获得精确相等的优雅,可读和非冗长的方法?
听起来很简单,这是一个邪恶的问题.该==运营商没有得到楠所做的工作,也有特殊待遇的零:
(+0.0 == -0.0) -> true
Double.NaN == Double.NaN -> false
Run Code Online (Sandbox Code Playgroud)
但我想确定两个值是否完全相同(但我不关心不同的NaN模式,因此任何NaN ==任何其他NaN - > true).
我可以用这个丑陋的Monster代码做到这一点:
Double.doubleToLongBits(a) == Double.doubleToLongBits(b)
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来写这个(并使意图明显)?
除了在编译时使用-p选项然后使用gprof时,有没有人知道用于分析OCaml代码的程序?我问这个问题是为了检查0.01秒的采样时间是否可以进一步降低?
关于sin用表格计算基本函数的文献参考公式:
sin(x) = sin(Cn) * cos(h) + cos(Cn) * sin(h)
Run Code Online (Sandbox Code Playgroud)
其中x = Cn + h,Cn是针对其恒定sin(Cn)和cos(Cn)已被预先计算并在表中可用的,并且,如果以下半乳糖的方法,Cn已被选择为使得两个sin(Cn)和cos(Cn)密切由浮点数近似.数量h接近0.0.此公式的参考示例是本文(第7页).
我不明白为什么这是有道理的:cos(h)然而,它被计算,对于某些值,至少0.5 ULP可能是错误的h,并且因为它接近1.0,这似乎对结果的准确性有极大的影响.sin(x)以这种方式计算.
我不明白为什么不使用下面的公式:
sin(x) = sin(Cn) + (sin(Cn) * (cos(h) - 1.0) + cos(Cn) * sin(h))
Run Code Online (Sandbox Code Playgroud)
然后两个量(cos(h) - 1.0),并sin(h)可以用,很容易做出准确的,因为它们产生接近零的结果多项式来近似.为价值观sin(Cn) * (cos(h) - 1.0), cos(Cn) * sin(h)并为他们的总和仍然很小,其绝对精度,该总和表示,因此,加入这个量的少量ULPS表达sin(Cn)几乎是正确舍入. …
Java和Eclipse的新手.出于某种原因,我第一次在给定的一天加载Eclipse,它冻结在"初始化Java工具:59%".最终,它超越了这一点,我可以完成我的工作.但是,这个"初始化Java工具:59%"阶段真的很长一段时间.有人知道它为什么这样做或如何解决它?
我对.NET程序集的密钥签名工作方式感到困惑.我通过插入密码并生成.pfx文件,用强名称签署了我的.NET程序集...
这怎么能保护我的dll?有人能用简单的语言向我解释一下吗?我是数字签名的新手,你必须采取一大步才能让我理解这一点
虽然,据我所知,IEEE 754没有提及关于刷新到零的模式来更快地处理非规范化数字,但是一些架构提供了这种模式(例如http://docs.sun.com/source/806-3568/ncg_lib .html).
在本技术文档的特定情况下,非规范化数字的标准处理是默认值,并且必须明确激活flush-to-zero.在默认模式下,非规范化数字也在软件中处理,这比较慢.
我在嵌入式C的静态分析器上工作,试图预测在运行时可能发生的值的正确(如果有时不精确)范围.它的目的是正确的,因为它可用于排除在运行时出现错误的可能性(例如对于关键的嵌入式代码).这需要在分析期间捕获所有可能的行为,因此在浮点计算期间产生所有可能的值.
在这方面,我的问题是双重的:
在嵌入式架构中,是否存在仅提供从零到零的架构?他们可能没有权利将自己宣传为"IEEE 754",但可以提供足够接近IEEE 754风格的浮点运算.
对于在嵌入式环境中提供两者的体系结构,可能不会被系统激活为零,以使反应时间更可预测(这些嵌入式系统的常见约束)?
在我用于浮点值的区间运算中处理flush-to-zero非常简单,如果我知道我必须这样做,我的问题是我是否必须这样做.
对于列表,您可以进行模式匹配并迭代直到第n个元素,但对于元组,您将如何获取第n个元素?