小编Pas*_*uoq的帖子

位域和序列点

对于打包f0f1放入同一字节的实现,下面的程序是定义的吗?

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:

在前一个和下一个序列点之间,一个对象的存储值最多只能通过表达式的评估来修改一次.[...]

我不清楚这一段对上述计划有何影响.

基于大量随机测试,大多数编译器似乎生成代码,其中两个分配不会干扰.

c c99 sequence-points bit-fields c11

17
推荐指数
1
解决办法
704
查看次数

GCC和相同类型的数组之间的严格别名

上下文

以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,也就是说,pq不能为同一个内存位置的别名:

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)

c gcc strict-aliasing

17
推荐指数
2
解决办法
673
查看次数

OCaml!=的意外结果

据我所知,=和!=应该用于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)

谁能解释一下?有一个更好的方法吗?

ocaml equality

16
推荐指数
1
解决办法
5416
查看次数

检查两个float/double值是否完全相等

什么是比较两个浮点值以获得精确相等的优雅,可读和非冗长的方法?

听起来很简单,这是一个邪恶的问题.该==运营商没有得到楠所做的工作,也有特殊待遇的零:

(+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)

有没有更好的方法来写这个(并使意图明显)?

java floating-point

16
推荐指数
2
解决办法
9352
查看次数

用于分析OCaml代码的工具

除了在编译时使用-p选项然后使用gprof时,有没有人知道用于分析OCaml代码的程序?我问这个问题是为了检查0.01秒的采样时间是否可以进一步降低?

profiling ocaml gprof

15
推荐指数
3
解决办法
1948
查看次数

当另一个公式似乎更有意义时,为什么基于表格的sin近似文献总是使用这个公式?

关于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)几乎是正确舍入. …

floating-point ieee-754 elementary-functions

15
推荐指数
2
解决办法
765
查看次数

Eclipse(Galileo):为什么"初始化Java工具:59%"需要FOREVER?

Java和Eclipse的新手.出于某种原因,我第一次在给定的一天加载Eclipse,它冻结在"初始化Java工具:59%".最终,它超越了这一点,我可以完成我的工作.但是,这个"初始化Java工具:59%"阶段真的很长一段时间.有人知道它为什么这样做或如何解决它?

java eclipse load delay eclipse-3.5

14
推荐指数
1
解决办法
2万
查看次数

.NET数字签名如何工作?

我对.NET程序集的密钥签名工作方式感到困惑.我通过插入密码并生成.pfx文件,用强名称签署了我的.NET程序集...

这怎么能保护我的dll?有人能用简单的语言向我解释一下吗?我是数字签名的新手,你必须采取一大步才能让我理解这一点

c# digital-signature

14
推荐指数
2
解决办法
6787
查看次数

浮点运算中的flush-to-zero行为

虽然,据我所知,IEEE 754没有提及关于刷新到零的模式来更快地处理非规范化数字,但是一些架构提供了这种模式(例如http://docs.sun.com/source/806-3568/ncg_lib .html).

在本技术文档的特定情况下,非规范化数字的标准处理是默认值,并且必须明确激活flush-to-zero.在默认模式下,非规范化数字也在软件中处理,这比较慢.

我在嵌入式C的静态分析器上工作,试图预测在运行时可能发生的值的正确(如果有时不精确)范围.它的目的是正确的,因为它可用于排除在运行时出现错误的可能性(例如对于关键的嵌入式代码).这需要在分析期间捕获所有可能的行为,因此在浮点计算期间产生所有可能的值.

在这方面,我的问题是双重的:

  1. 在嵌入式架构中,是否存在仅提供从零到零的架构?他们可能没有权利将自己宣传为"IEEE 754",但可以提供足够接近IEEE 754风格的浮点运算.

  2. 对于在嵌入式环境中提供两者的体系结构,可能不会被系统激活为零,以使反应时间更可预测(这些嵌入式系统的常见约束)?

在我用于浮点值的区间运算中处理flush-to-zero非常简单,如果我知道我必须这样做,我的问题是我是否必须这样做.

c embedded floating-point ieee-754

13
推荐指数
1
解决办法
4278
查看次数

OCaml:提取元组的第n个元素?

对于列表,您可以进行模式匹配并迭代直到第n个元素,但对于元组,您将如何获取第n个元素?

ocaml functional-programming

13
推荐指数
2
解决办法
2万
查看次数