小编Pas*_*uoq的帖子

如何从十进制数转换为IEEE 754单精度浮点格式?

如何手动将十进制(基数为10)的数字转换为IEEE 754单精度浮点格式?我知道它有三个部分,一个符号,一个指数和一个尾数.我只是不完全理解最后两个部分实际代表什么.

floating-point binary ieee-754

20
推荐指数
3
解决办法
8万
查看次数

是否可以在OCaml中使用管道?

在F#我不能没有管道(<||>)

let console(dashboard : Dashboard ref) = 
    let rec eat (command : string) =
        command.Split(' ','(',')') 
        |> Seq.filter(fun s -> s.Length <> 0)
        |> fun C ->
            (Seq.head C).ToUpper() |> fun head ->
Run Code Online (Sandbox Code Playgroud)

我可以使用<||>OCaml中?

syntax ocaml

20
推荐指数
1
解决办法
3275
查看次数

内存依赖性推测会阻止BN_consttime_swap成为恒定时间吗?

上下文

OpenSSL中的功能 BN_consttime_swap是一件美丽的事情.在此片段中,condition已计算为0(BN_ULONG)-1:

#define BN_CONSTTIME_SWAP(ind) \
    do { \
            t = (a->d[ind] ^ b->d[ind]) & condition; \
            a->d[ind] ^= t; \
            b->d[ind] ^= t; \
    } while (0)
…
    BN_CONSTTIME_SWAP(9);
…
    BN_CONSTTIME_SWAP(8);
…
    BN_CONSTTIME_SWAP(7);
Run Code Online (Sandbox Code Playgroud)

目的是为了确保更高级别的bignum操作需要恒定的时间,这个功能要么交换两个bignum,要么在恒定时间内将它们留在原位.当它离开它们时,它实际上读取每个bignum的每个单词,计算一个与旧单词相同的新单词,并将该结果写回原始位置.

目的是这将花费相同的时间,好像有效地交换了bignums.

在这个问题中,我假设一个现代的,广泛的架构,如Agner Fog在他的优化手册中描述的那些.还假设C代码直接转换为汇编(没有C编译器撤消程序员的努力).

我试图理解上面的构造是否表征为"尽力而为"的恒定时间执行,或者是完美的恒定时间执行.

特别是,我担心aBN_consttime_swap调用函数时bignum 已经在L1数据缓存中的情况,并且函数返回后的代码立即开始在bignum上工作a.在现代处理器上,足够的指令可以同时在飞行中,以便在a使用bignum时技术上不会完成复制.在调用之后允许指令BN_consttime_swap工作的机制a存储器依赖性推测.让我们假设为了论证而进行天真的记忆依赖性推测.

这个问题似乎归结为:

当处理器最终检测到BN_consttime_swap从内存读取后的代码,与推测相反,已经写入函数内部时,一旦检测到地址已被写入,它是否取消推测执行,或者它是否允许自己当它检测到已写入的值与已存在的值相同时保留它?

在第一种情况下,BN_consttime_swap看起来它实现了完美的恒定时间.在第二种情况下,它只是尽力而为的恒定时间:如果没有交换bignums,那么在调用之后执行的代码BN_consttime_swap将比它们被交换时快得多.

即使在第二种情况下,这看起来似乎可以在可预见的未来固定(只要处理器保持足够天真),对于两个bignums中的每一个的每个单词,写出不同于两个可能的最终值的值.在再次写入旧值或新值之前的值.该volatile类型修饰符可能需要在某一时刻参与,以防止一个普通的编译器过度优化的序列,但它仍然听起来可能. …

c assembly openssl constant-time micro-architecture

20
推荐指数
2
解决办法
1243
查看次数

constexpr与纯函数之间的关系

我是对的,那个:

  • 定义的任何函数constexpr都是纯函数,和
  • constexpr如果编译器的价格不是很高,那么任何纯函数都可以并且必须定义.

如果是这样,为什么不<cmath>定义函数constexpr

c++ constexpr c++11

19
推荐指数
3
解决办法
2598
查看次数

C11与C99中临时物体的寿命

我试图破译导致C99和C11之间发生变化的注释.该说明中提出的修改最终以C11的6.2.4:8结束,即:

具有结构或联合类型的非左值表达式,其中结构或联合包含具有数组类型的成员(包括,递归地,所有包含的结构和联合的成员)是指具有自动存储持续时间和临时生存期的对象.它的生命周期在评估表达式时开始,其初始值是表达式的值.当包含完整表达式或完整声明符的评估结束时,它的生命周期结束.任何使用临时生命周期修改对象的尝试都会导致未定义的行为.

我理解为什么需要进行更改(这里可以进行一些讨论.请注意,讨论可以追溯到C11之前).然而,我不明白的是克拉克·尼尔森写下他的笔记时所说的一句话:

请注意,此方法另外声明了一个这样的示例,它符合C99,是不符合要求的:

struct X { int a[5]; } f();
int *p = f().a;
printf("%p\n", p);
Run Code Online (Sandbox Code Playgroud)

我理解为什么这个例子在C11下是不符合的.我特别不明白的是它是如何符合C99的.并且,如果它是在C99下定义的,它应该做什么,定义打印悬空指针的值?

c c99 c11

18
推荐指数
1
解决办法
1159
查看次数

添加两个浮点数

我想计算两个IEEE 754二进制64号的总和,四舍五入.为此我在下面写了C99程序:

#include <stdio.h>
#include <fenv.h>
#pragma STDC FENV_ACCESS ON

int main(int c, char *v[]){
  fesetround(FE_UPWARD);
  printf("%a\n", 0x1.0p0 + 0x1.0p-80);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用各种编译器编译并运行我的程序:

$ gcc -v
…
gcc version 4.2.1 (Apple Inc. build 5664)
$ gcc -Wall -std=c99 add.c && ./a.out 
add.c:3: warning: ignoring #pragma STDC FENV_ACCESS
0x1p+0
$ clang -v
Apple clang version 1.5 (tags/Apple/clang-60)
Target: x86_64-apple-darwin10
Thread model: posix
$ clang -Wall -std=c99 add.c && ./a.out 
add.c:3:14: warning: pragma STDC FENV_ACCESS ON is not supported, ignoring
      pragma [-Wunknown-pragmas]
#pragma …

floating-point gcc c99 clang fenv

18
推荐指数
2
解决办法
1207
查看次数

如何从OCaml中的文本文件中读取行?

这就是我到目前为止所拥有的.这不就是你需要的吗?我一直收到错误"错误:未绑定模块标准"

let r file =
    let chan = open_in file in
    Std.input_list (chan)
Run Code Online (Sandbox Code Playgroud)

ocaml

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

除以零不会抛出SIGFPE

我有一个小程序执行零浮点除法,所以我期待SIGFPE.

#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

void signal_handler (int signo) {
    if(signo == SIGFPE) {
      std::cout << "Caught FPE\n";
    }
}

int main (void) {
  signal(SIGFPE,(*signal_handler));

  double b = 1.0;
  double c = 0.0;
  double d = b/c;
  std::cout << "d = "<< d << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

实际上,我得到了以下输出:

d = inf
Run Code Online (Sandbox Code Playgroud)

gcc版本4.5.2(Ubuntu/Linaro 4.5.2-8ubuntu4)

在这种情况下,我应该怎么做才能抛出SIGFPE?FP操作行为依赖于哪些因素(编译器标志/ CPU类型等)?

谢谢

c++ floating-point gcc sigfpe

17
推荐指数
3
解决办法
6973
查看次数

左右移位负整数是否定义了行为?

我知道,正确移位负签名类型取决于实现,但是如果我执行左移怎么办?例如:

int i = -1;
i << 1;
Run Code Online (Sandbox Code Playgroud)

这个定义明确吗?

我认为该标准没有说明带有签名类型的负值

如果E1具有带符号类型和非负值,并且E1×2 E2在结果类型中可表示,那么这就是结果值; 否则,行为未定义.

它只阐明如果结果在签名类型中无法表示,则行为未定义.

c++ bit-shift undefined-behavior

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

位域和序列点

对于打包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
查看次数