获取以下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中正式化
我试图实现动态滚动(这是不是一个好主意不是问题)并经历了一些"奇怪"的行为.
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) 基本上这个问题说明了一切,我的直觉告诉我,呼叫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)
如果我们let add a b = a+b
那么做
add :: Num a => a -> a -> a.
我们也知道1.5 :: Fractional a => a.并且add 1 1.5完美无瑕.
如果我理解正确的每其中有一个实例类型Fractional也有一个实例Num,但这一事实是怎样作出了明确?
我在鬼混,发现以下
#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)