小编Ada*_*dam的帖子

严格证明以下C++代码的属性?

获取以下C++ 14代码段:

unsigned int f(unsigned int a, unsigned int b){
    if(a>b)return a;
    return b;
}
Run Code Online (Sandbox Code Playgroud)

声明: 该函数f返回其参数的最大值.

现在,该陈述"显然"是正确的,但我未能严格证明ISO/IEC 14882:2014(E)规范.

第一:我不能以正式的方式陈述财产.

形式化版本可以是:对于每个语句s,当抽象机器(在规范中定义)处于状态P并且s看起来像"f(expr_a,expr_b)"并且s中的 'f' 被解析为有问题的函数,s(P).return = max(expr_a(P).return,expr_b(P).return).

这里对于状态P和表达式s,s(P)是在评估s之后的机器的状态.

问题:该陈述的正确形式化版本是什么?如何使用上述规范强加的属性来证明声明?对于每个演绎步骤,请参考允许所述步骤的标准中的适用片段(片段的数量足够).

编辑:也许在Coq中正式化

c++ static-analysis coq proof-of-correctness

8
推荐指数
1
解决办法
484
查看次数

javascript中的奇怪计时行为

我试图实现动态滚动(这是不是一个好主意不是问题)并经历了一些"奇怪"的行为.

function scroll(timestamp){
    var deltaTime = timestamp - this.scrollLastTime;
    this.scrollLastTime = timestamp;
    console.log(deltaTime);
    var newPosition = this.scrollTop + this.scrollSpeed*deltaTime;
    if(newPosition <= 0){
      this.scrollTop = 0;
      this.scrolling = false;
      return;
    }else if(newPosition > this.scrollHeight-this.clientHeight){
      this.scrollTop = this.scrollHeight-this.clientHeight;
      this.scrolling = false;
    }else{
      this.scrollTop = newPosition;
      var newSpeed = this.scrollSpeed + Math.sign(this.scrollSpeed) * this.scrollAcceleration*deltaTime;
      if(this.scrollSpeed < 0 && newSpeed >= 0){
        this.scrolling = false;
      }else if(this.scrollSpeed >0 && newSpeed <= 0){
        this.scrolling = false;
      }else{
        this.scrollSpeed = newSpeed;
        window.requestAnimationFrame(this.scrollCallback);
      }
    }
  }
  document.getElementById("0").addEventListener('wheel', …
Run Code Online (Sandbox Code Playgroud)

javascript

6
推荐指数
1
解决办法
193
查看次数

为什么`minmax`需要比连续的'min`和`max`更长的时间?

基本上这个问题说明了一切,我的直觉告诉我,呼叫minmax应该花费的时间少于呼叫a min然后a max.

是否有一些优化我阻止Matlab执行以下代码?

MINMAX:

function minmax_vals = minmaxtest()
    buffSize = 1000000;
    A = rand(128,buffSize);
    windowSize = 100;
    minmax_vals = zeros(128,buffSize/windowSize*2);
    for i=1:(buffSize/windowSize)
        minmax_vals(:,(2*i-1):(2*i)) = minmax(A(:,((i-1)*windowSize+1):(i*windowSize)));
    end
end
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

单独的最小 - 最大:

function minmax_vals = minmaxtest()
    buffSize = 1000000;
    A = rand(128,buffSize);
    windowSize = 100;
    minmax_vals = zeros(128,buffSize/windowSize*2);
    for i=1:(buffSize/windowSize)
        minmax_vals(:,(2*i-1)) = min(A(:,((i-1)*windowSize+1):(i*windowSize)),[],2);
        minmax_vals(:,(2*i)) = max(A(:,((i-1)*windowSize+1):(i*windowSize)),[],2);
    end
end
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

matlab

3
推荐指数
1
解决办法
59
查看次数

Coq的非建设性证明?

可以用Coq中的非建构方式证明存在定理吗?具体而言,我正在考虑证明存在无理数的问题是合理的.

coq

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

我们如何知道类型类是否是另一个类型类的子类型类?

如果我们let add a b = a+b 那么做 add :: Num a => a -> a -> a.

我们也知道1.5 :: Fractional a => a.并且add 1 1.5完美无瑕.

如果我理解正确的每其中有一个实例类型Fractional也有一个实例Num,但这一事实是怎样作出了明确?

haskell

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

为什么使用 leal 而不是 incq?

我在鬼混,发现以下

#include <stdio.h>

void f(int& x){
    x+=1;
}

int main(){
    int a = 12;
    f(a);
    printf("%d\n",a);
}
Run Code Online (Sandbox Code Playgroud)

当由g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4with翻译g++ main.cpp -S生成此组件时(仅显示相关部件)

_Z1fRi:
    pushq   %rbp
    movq    %rsp, %rbp
    movq    %rdi, -8(%rbp)
    movq    -8(%rbp), %rax
    movl    (%rax), %eax
    leal    1(%rax), %edx
    movq    -8(%rbp), %rax
    movl    %edx, (%rax)
    popq    %rbp
    ret
main:
    pushq   %rbp
    movq    %rsp, %rbp
    subq    $16, %rsp
    movl    $12, -4(%rbp)
    leaq    -4(%rbp), %rax
    movq    %rax, %rdi
    call    _Z1fRi
    movl    -4(%rbp), %eax
    movl    %eax, %esi …
Run Code Online (Sandbox Code Playgroud)

c++ assembly g++ x86-64

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